11. 数组:
Shell中提供了创建一维数组的能力,你可以把一串数字、名字或者文件放在一个变量中。使用declare的-a选项即可创建它们,或者在变量后面增加下标操作符直接创建。和很多其它开发语言一样,Shell中的数组也是0开始的,然而不同的是Shell中数组的下标是可以不连续的。获取数组中某个元素的语法格式为: ${arrayname[index]}。见如下示例:
/> declare -a friends #声明一个数组变量
/> friends=(sheryl peter louise) #给数组变量赋值
/> echo ${friends[0]} #通过数组下标的方式访问数组的元素
sheryl
/> echo ${friends[1]}
peter
/> echo ${friends[2]}
louise
/> echo ${friends[*]} #下标中星号表示所有元素。
shery1 peter louise
# ${#array[*]}表示数组中元素的数量,而${#friend[0]}则表示第一个元素的长度。
/> echo ${#friends[*]}
3
/> unset friends #unset array清空整个数组,unset array[index]仅清空指定下标的元素。
/> x[3]=100
/> echo ${x[*]}
100
/> echo ${x[0]} #0下标的元素并没有被赋值过,因为输出为空。
/> echo ${x[3]}
100
/> states=(ME [3]=CA [2]=CT) #ME的下标为0。
/> echo ${states[0]}
ME
/> echo ${states[1]} #数组下标为1的位置没有被赋值过,因此没有输出。
/> echo ${states[2]}
CT
/> echo ${states[3]}
CA
12. 函数:
和C语言一样,Shell中也可以创建自己的自定义函数。其格式如下:
function_name () { commands; commands; }
function function_name { commands; commands; }
function function_name () { commands; commands; }
函数的参数在函数内是以$[0-9]、${10}...,这种局部变量的方式来访问的。见下面的示例:
#函数的左花括号和命令之间必须有至少一个空格。每个命令的后面都要有一个分号,即便是最后一个命令
/> function greet { echo "Hello $LOGNAME, today is $(date)"; }
#此时函数已经驻留在当前的bash shell中,因此使用函数效率更高。
/> greet
Hello root, today is Fri Nov 18 20:45:10 CST 2011
/> greet() { echo "Hello $LOGNAME, today is $(date)"; }
/> greet
Hello root, today is Fri Nov 18 20:46:40 CST 2011
#welcome函数内部使用了函数参数。
/> function welcome { echo "Hi $1 and $2"; }
/> welcome stephen jane
Hi stephen and jane
#declare -F选项将列出当前Shell中驻留的函数
/> declare -F
declare -f greet
declare -f welcome
#清空指定的函数,使其不在Shell中驻留。
/> unset -f welcome
13. 重定向:
下面的列表为Shell中支持的重新定向操作符。
操作符 |
功能 |
< |
重新定向输入 |
> |
重新定向输出 |
>> |
追加输出 |
2> |
重新定向错误 |
&> |
重新定向错误和输出 |
>& |
重新定向错误和输出 |
2>&1 |
重新定向错误到标准输出 |
1>&2 |
重新定向标准输出到错误 |
>| |
重新定向输出的时候覆盖noclobber选项 |
#find命令将搜索结果输出到foundit文件,把错误信息输出到/dev/null
/> find . -name "*.c" -print > foundit 2> /dev/null
#将find命令的搜索结果和错误信息均输出到foundit文件中。
/> find . -name "*.c" -print >& foundit
#同上。
/> find . -name "*.c" -print > foundit 2>&1
#echo命令先将错误输出到errfile,再把信息发送到标准错误,该信息标准错误与标准输出合并在一起(errfile中)。
/> echo "File needs an argument" 2> errfile 1>&2
和C语言一样,Shell中也可以创建自己的自定义函数。其格式如下:
function_name () { commands; commands; }
function function_name { commands; commands; }
function function_name () { commands; commands; }
函数的参数在函数内是以$[0-9]、${10}...,这种局部变量的方式来访问的。见下面的示例:
#函数的左花括号和命令之间必须有至少一个空格。每个命令的后面都要有一个分号,即便是最后一个命令
/> function greet { echo "Hello $LOGNAME, today is $(date)"; }
#此时函数已经驻留在当前的bash shell中,因此使用函数效率更高。
/> greet
Hello root, today is Fri Nov 18 20:45:10 CST 2011
/> greet() { echo "Hello $LOGNAME, today is $(date)"; }
/> greet
Hello root, today is Fri Nov 18 20:46:40 CST 2011
#welcome函数内部使用了函数参数。
/> function welcome { echo "Hi $1 and $2"; }
/> welcome stephen jane
Hi stephen and jane
#declare -F选项将列出当前Shell中驻留的函数
/> declare -F
declare -f greet
declare -f welcome
#清空指定的函数,使其不在Shell中驻留。
/> unset -f welcome
13. 重定向:
下面的列表为Shell中支持的重新定向操作符。
操作符 |
功能 |
< |
重新定向输入 |
> |
重新定向输出 |
>> |
追加输出 |
2> |
重新定向错误 |
&> |
重新定向错误和输出 |
>& |
重新定向错误和输出 |
2>&1 |
重新定向错误到标准输出 |
1>&2 |
重新定向标准输出到错误 |
>| |
重新定向输出的时候覆盖noclobber选项 |
#find命令将搜索结果输出到foundit文件,把错误信息输出到/dev/null
/> find . -name "*.c" -print > foundit 2> /dev/null
#将find命令的搜索结果和错误信息均输出到foundit文件中。
/> find . -name "*.c" -print >& foundit
#同上。
/> find . -name "*.c" -print > foundit 2>&1
#echo命令先将错误输出到errfile,再把信息发送到标准错误,该信息标准错误与标准输出合并在一起(errfile中)。
/> echo "File needs an argument" 2> errfile 1>&2
/> cat errfile