shell的方法在相同的进程内执行,与调用它的脚本一致。对于方法来说,脚本中的所有变量均可见,且不需要执行export。方法中可以创建局部变量,且不影响正在调用的脚本。

1. 定义语法

(1) KornShell中的定义格式为:function name <复合命令>

(2) Bourne shell中的定义格式为: name() <复合命令>

(3) bash允许的格式:function name() <复合命令>

一个参数设置方法的返回码,若没有参数,方法的退出码默认为执行的最后一个命令执行结果。

local为shell中的内置命令,可用于限制方法(以及其子方法)中变量的作用域,但父进程中的变量不会改变。当参数扩展时,使用IFS而非空格将会导致分词。Bash4.0中, local和declare存在一个选项 -A,用于声明关联数组。

例:判断ip是否有效

  1. ## 检测Ip是否有效
  2. isvalidip(){
  3. case $ in
  4. "" | *[!-.]* | *[!-]) return ;; ## 空值、非法字符、不以数字结尾,均不符合Ip
  5. esac
  6.  
  7. ## 将IFS设置为点号,但仅限于该方法中
  8. local IFS=.
  9.  
  10. ## 将Ip设为位置参数,分词之后,每个元素变成了参数
  11. set -- $
  12.  
  13. ## 必须有4个参数,每个元素必须小于256,参数为空时,默认为666
  14. [ $# -eq ] &&
  15. [ ${:-} -le ] &&
  16. [ ${:-} -le ] &&
  17. [ ${:-} -le ] &&
  18. [ ${:-} -le ] &&
  19. }

使用source命令使脚本中的方法在当前shell中有效:. isvalidip

  1. $ for ip in 127.0.0.1 168.260.0.234 123.100.34.32 204.255.122.150
  2. > do
  3. > if isvalidip "$ip"
  4. > then
  5. > printf "%15s: valid\n" "$ip"
  6. > else
  7. > printf "%15s: invalid\n" "$ip"
  8. > fi
  9. > done
  10.  
  11. 127.0.0.1: valid
  12. 168.260.0.234: invalid
  13. 123.100.34.32: valid
  14. 204.255.122.150: valid

2. 复合命令

复合命令可以是一组封装在( ... )或{ ... }中的命令,封装在(( ... ))或[[ ... ]]中的表达式,或者shell的关键词块(case, for, while, select, until)。

例:检查有效整型

  1. valint() #@ USAGE: valint INTEGER
  2. case ${#-} in ## 接收负数
  3. *[!-]*) echo false;; ## 包含非数字字符
  4. *) echo true;;
  5. esac

   若方法的主体由引号包含,则它将在子shell中执行,并且执行期间产生的变化在退出时不再有效。

  1. $ funky() (nam=nobody; echo "name = $name")
  2. name=Rempelstilskin
  3. $ funky
  4. name = nobody
  5. $ echo "name = $name"
  6. name = Rempelstilskin

3. 获取结果

1) 设置不同的退出码

例:检验整型是否在特定范围

  1. rangecheck() #@ USAGE: rangecheck int [low [high]]
  2. if [ "$1" -lt ${:-} ];then ## 数值太小返回1,若无第二个参数,默认为10
  3. return
  4. elif [ "$1" -gt ${:-} ];then ## 数据太大返回0,若无第三个参数,默认为20
  5. return
  6. else
  7. return
  8. fi

2) 打印结果

例:打印环境变量信息

  1. uinfo() #@ USAGE: uinfo [file]
  2. {
  3. printf "%12s: %s\n" \
  4. USER "${USER:-No value assigned }" \
  5. PWD "${PWD:-No value assigned}" \
  6. COLUMNS "${COLUMNS:-No value assigned}" \
  7. LINES "${LINES:-No value assigned}" \
  8. SHELL "${SHELL:-No value assigned}" \
  9. HOME "${HOME:-No value assigned}" \
  10. TERM "${TERM:-No value assigned}"
  11. } > ${:-/dev/fd/}

3) 结果保存在多个变量中

例:3个整数排序

  1. _max3() #@ 对3个整数排序,并且分别保存在$_MAX3,$_MID3及$_MIN3中
  2. {
  3. [ $# -ne ] && return
  4. [ $ -gt $ ] && { set -- $ $ $; }
  5. [ $ -gt $ ] && { set -- $ $ $; }
  6. [ $ -gt $ ] && { set -- $ $ $; }
  7. _MAX3=$
  8. _MID3=$
  9. _MIN3=$
  10. printf "%d\t%d\t%d\n" $_MAX3 $_MID3 $_MIN3
  11. }
  12.  
  13. max3() #@ 对3个整数排序并保存在array中
  14. {
  15. declare -n _max3=${:-_MAX3} #@ 当命令行未提供变量名,则默认使用_MAX3
  16. (( $# < )) && return
  17. (( $ > $ )) && set -- "$2" "$1" "$3"
  18. (( $ > $ )) && set -- "$1" "$3" "$2"
  19. (( $ > $ )) && set -- "$2" "$1" "$3"
  20. _max3=( "$3" "$2" "$1" )
  21. }

4. 示例脚本

  1. ##
  2. ## 设置默认
  3. ##
  4. prompt=" ==> "
  5. template='<!DOCTYPY html>
  6. <html lang="en">
  7. <head>
  8. <meta charset=utf->
  9. <title>%s</title>
  10. <link href=%s" rel="stylesheet">
  11. </head>
  12. <body>
  13. <h1>%s</h1>
  14. <div id=main></div>
  15. </body>
  16. </html>
  17. '
  18.  
  19. ##
  20. ## 定义shell函数
  21. ##
  22. die(){ #@ 描述:打印错误信息,并且以ERROR退出
  23. error=$
  24. shift
  25. [ -n "$*" ] && printf "%s\n" "$*" >&
  26. exit "$error"
  27. }
  28.  
  29. usage(){ #@ 打印脚本使用用途
  30. printf "USAGE: %s HTMLFILE\n" "$progname"
  31. }
  32.  
  33. version(){
  34. printf "%s version %s: " "$progname" "${version:-1}"
  35. }
  36.  
  37. bashversion=${BASH_VERSION%%.*}
  38. if [ ${bashversion:-} -ge ];then
  39. ## bash4.x 的read有-i选项,用于提供一个初始值(如下的$)
  40. readline(){
  41. read -ep "${2:-"$prompt"}" -i "$3" "$1"
  42. }
  43. elif [ ${BASHVERSION:-} -ge ];then
  44. readline(){
  45. history -s "$3"
  46. printf "Press up arror to edit default value: '%s'\n" "${2:-none}"
  47. read -ep "${2:-"$prompt"}" "$1"
  48. }
  49. else
  50. readline(){
  51. printf "Press enter for default of '%s'\n" "$3"
  52. printf "%s " "${2:-"$prompt"}"
  53. read
  54. eval "$1=\${REPLY:-"$"}"
  55. }
  56. fi
  57.  
  58. if [ $# -ne ];then
  59. usage
  60. exit
  61. fi
  62.  
  63. filename=$
  64.  
  65. readline title "Page title: "
  66. readline h1 "Main headline: " "$title"
  67. readline css "Style sheet file: " "${filename%.*}.css"
  68.  
  69. printf "$template" "$title" "$css" "$h1" > "$filename" 
  1. 执行示例结果: 
  1. $ bash test.sh test
  2. Page title: hello
  3. Main headline: hello
  4. Style sheet file: test.css
  5. $ cat test
  6. <!DOCTYPY html>
  7. <html lang="en">
  8. <head>
  9. <meta charset=utf->
  10. <title>hello</title>
  11. <link href=test.css" rel="stylesheet">
  12. </head>
  13. <body>
  14. <h1>hello</h1>
  15. <div id=main></div>
  16. </body>
  17. </html>

Bash编程(5) Shell方法的更多相关文章

  1. Linux中bash编程

    bash编程也叫shell编程 预定义变量         $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...

  2. 怎样用 Bash 编程:逻辑操作符和 shell 扩展

    学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...

  3. shell编程===执行shell脚本的四种方法

    使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...

  4. [shell] Bash编程总结

    由于工作需要,之前的几个月写了一些Bash脚本,主要完成自动测试.打包.安装包等.虽然相比C++编程,要简单.傻瓜,但其在类Unix系统中可以大大提高工作的效率.所以在此对脚本编程过程中一些注意事项进 ...

  5. bash编程总结

    bash应该是目前Linux上最流行的shell脚本解释程序了(还有个shell叫dash,我太讨厌这个东东了.),只要你在linux上工作,并且希望自己能够工作得更愉悦,那么你应该熟悉最基本的bas ...

  6. bash编程基础

    bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...

  7. 【Shell编程】Shell程序设计

    1.Shell简介   作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统.   Sh ...

  8. 怎样用 Bash 编程:语法和工具

    让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇. Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的.每当用户或者系统管理员 ...

  9. CentOS Grub、BASH 故障、解决方法

    简介: Grub 常见的两种故障:Grub.conf 文件丢失.MBR 损坏 ( 不管恢复怎么样,还是先备份好吧 ) 一.Grub.conf 文件丢失 shell > rm -rf /boot/ ...

随机推荐

  1. ArcGIS应用——使用Python为图斑连续编号及扩展应用

    为图斑连续编号 在GIS应用中,为图斑连续编号(编号递增)是一项常见的需求,利用ArcGIS,可以方便的实现. Python脚本如下: rec=0 def autoIncrement(): globa ...

  2. HBase介绍(3)---框架结构及流程

    HBASE依托于Hadoop的HDFS作为存储基础,因此结构也很类似于Hadoop的Master-Slave模式,Hbase Master Server 负责管理所有的HRegion Server,但 ...

  3. docker 进入容器

  4. System Workbench for STM32(based on Eclipse)开发环境配置

    导入现有项目 不能有同名项目,即使不是同一目录 编译 根目录的Debug目录是编译时自动生成的.另外如果项目使用了git,那么编译时会自动在根目录生成一个.gitignore文件,把Debug目录排除 ...

  5. C#中Attribute/特性的使用

    类似Java的注解/Annotation 特性是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签,这个标签可以有多个.您可以通过使用特性向程序添加声明性信息.一 ...

  6. 企业库连接形式简单例子记录 EnterpriseLibrary.Data

    结构图 webconfig 配置正确的连接字符串 <connectionStrings> <add name="DBConnection" connectionS ...

  7. 模糊查询中Like的使用

    通配符: %. _ %:表示任意个或多个字符.可匹配任意类型和长度的字符 _:表示任意单个字符.匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符) demo: //usern ...

  8. Tomcat内存溢出解决java.lang.OutOfMemoryError: PermGen space

    背景:把两个项目同时部署在tomcat,启动快好的时候,报java.lang.OutOfMemoryError: PermGen space 原因:因为两个项目的jar包太多,JVM把里面的class ...

  9. SP16549 QTREE6 - Query on a tree VI(LCT)

    题意翻译 题目描述 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥 ...

  10. exec和xargs

    参考:http://www.cnblogs.com/itxdm/p/5936907.html 一. 先复习下find命令 1. name参数 find -name tom 或 find -iname ...