shell 脚本之函数

简介

函数是一些命令的集合,用一个名称做代表,称为函数名。

函数的最大作用就是让程序模块化。

Bash调用函数时不会开启新的shell,会在现有shell环境中执行该函数。

用法

语法

有3种写法,推荐用第2种。


function  funcName() {
     cmds...
}

funcName() {
     cmds...
}

function  funcName {
     cmds...
}

调用函数

函数调用直接写出函数名称即可,如果有参数,写在函数名称后面,空格分隔。


funcName
funcName  paramVal1  paramVal2  paramVal3

取消函数定义

unset -f funcName

在函数执行期间,Bash会建立一个特别的变量FUNCNAME,值为函数名称。

函数的结束状态

执行函数时,函数中最后一个命令的返回值代表函数的结束状态,如果遇到return命令,则立即返回,return命令可以指定函数的返回值。

函数与变量的作用范围

函数仅在定义的shell环境中有效,如果要传递函数给子shell环境使用,需要使用命令export及其选项-fexport -f funcName

变量的作用域默认是全局的。可用local将变量设置为函数私有的。

位置参数

函数的参数借用了命令行的位置参数的概念,用来传递变量值。

当函数借用命令行的位置参数时,原位置参数值会被暂时保存起来,等到函数执行结束,会再复原其值。

移动位置参数

shift [n]:往前移动位置参数的值,移动n个单位,n默认是1。

指定位置参数的值

set val1 val2 ...:set命令设定位置参数的值,按顺序将对应的值传给 $1, $2, $3, ....

如果要一次重置所有的位置参数,使其值为空,可执行:set --

取命令行选项和参数

使用内置命令getopts:getopts 选项行 选项变量。其中的选项行由单一字符组成。

如果某个选项需要提供一个参数,则在选项字符后方接上冒号:,当选项没有提供额外的参数时,Bash就会提示错误信息,如果不想出现错误信息,可在选项行的最前面加上冒号:

选项变量的作用:getopts由命令行取得选项,把它放入选项变量中,如果该选项需要额外的参数,参数值会放入OPTARG变量中。

继续阅读

shell 脚本之条件测试和流程结构

条件测试

每个命令结束后,都有返回一个结束状态值,值为0表示执行成功,非0表示失败。条件测试就是以状态返回值的真假值作为判断依据:值为0判断为真,非0判断为假。

条件测试的写法

  • 执行一个命令,可以包括管道命令。例如:

if  grep  -q  "rm"  fn.sh;  then
     echo "find rm command."
else
     echo  "not found ."
fi
  • 传回某一命令执行结果的相反值:! command!与命令之间用空格分开。

if  !  grep  -q  "rm"  fn.sh;  then
     echo  "not found ."
else
     echo "find rm command."
fi
  • 使用符合命令:(( expression ))。如果expression的值不为0,则传回真值(0),否则传回假值(1)。
  • 使用Bash关键字[[]]组成的式子:[[ 判断式 ]]注意:[[ 的后面、]]的前面都要有空格。


if  [[ str > xyz ]];  then
     echo "str bigger than  xyz."
else
     echo "str not bigger than  xyz."
fi
  • 使用内置命令test: test 判断式

if  test "str" \> "xyz";  then
     echo "str bigger than  xyz."
else
     echo "str not bigger than  xyz."
fi
  • 使用内置命令:[][]test的用法是相同的,可以互换。注意:[ 的后面、]的前面都要有空格。

if  [ "str" \> "xyz" ];  then
     echo "str bigger than  xyz."
else
     echo "str not bigger than  xyz."
fi
  • 使用-a, -o进行逻辑组合。-a是逻辑与,-o逻辑或。例如:[ -f filename -a -x filename ],如果filename可读且可执行则为真。

  • 注意:

    • test[]都需要对Bash特殊字符进行转义;而[[]]不需要,<, >, &&, ||都可以在其中自由使用。
    • [[ 判断式 ]]中,如果使用==, !=,且在这两个运算符右边的字符串没有加上单引号或双引号,则==, !=会视为需要匹配该字符串所形成的“样式”,如果匹配,返回0,否则返回1。
    • [[ 判断式 ]]中,=~的右边放置要匹配的样式。样式不能用引号引起,否则不会被当作样式匹配。

继续阅读

shell 脚本之变量、数组、扩展

变量

变量是什么

在Bash shell中,只有一种数据型态:以字符组成的字符串。Bash Shell把任何存储在变量中的值,皆视为以字符组成的“字符串”。
要使用Bash Shell变量,不需要经过实现声明。

每个Shell环境都会维护一份它们自己的变量空间,彼此不互相影响。

变量命名

变量名可用英文字母、数字及下划线组成,但开头第一个字符不能是数字;变量名长度不限制;大小写敏感;

变量赋值

给变量赋值时,等号两边不可以有空白;若变量值有空白,则要用引号括起来。

变量和引号

推荐习惯:把字符串用双引号或单引号括起来。
在双引号中,可进行以下3个操作:替换变量;替换命令执行结果;替换算术运算结果。

单引号的作用是形成一个所见即所得的字符串,不会进行任何变量替换的操作。

取变量值

$变量名${变量名}
前者在变量名后面是空白符时使用,后者在变量名与其他字母、数字、下划线混合时使用。

取消变量:

取消变量就是把变量从变量空间删除释放。


unset 变量名
unset -v 变量名
unset -f 函数名

清空变量

变量仍然存在,只不过值是长度为0的字符串。

变量名=

继续阅读