Shell

70 阅读2分钟

一、位置参数

除了默认环境变量,dash shell还给命令行上定义的参数分配了特殊变量。下面是dash shell

中用到的位置参数变量。

 $0:shell的名称。

 $n:第n个位置参数。

 $*:含有所有参数内容的单个值,由IFS环境变量中的第一个字符分隔;没定义IFS的话,

由空格分隔。

 $@:将所有的命令行参数展开为多个参数。

 $#:位置参数的总数。

 $?:最近一个命令的退出状态码。

 $-:当前选项标记。

 $$:当前shell的进程ID(PID)。

 $!:最近一个后台命令的PID。

二、向函数传数组参数

如果你试图将该数组变量作为函数参数,函数只会取数组变量的第一个值。

要解决这个问题,你必须将该数组变量的值分解成单个的值,然后将这些值作为函数参数使

用。在函数内部,可以将所有的参数重新组合成一个新的变量。下面是个具体的例子。

$ cat test10

脚本内容:

#!/bin/bash 
# array variable to function test function testit 
{     
local newarray     
newarray=(;'echo "$@"') 
    
echo "The new array value is: ${newarray[*]}" 
}


myarray=(1 2 3 4 5) 
echo "The original array is ${myarray[*]}" 
testit ${myarray[*]}

命令输出:

$ ./test10 The original array is 1 2 3 4 5 The new array value is: 1 2 3 4 5 

移动变量

bash shell工具箱中另一件工具是shift命令。bash shell的shift命令能够用来操作命令行参

数。跟字面上的意思一样,shift命令会根据它们的相对位置来移动命令行参数。

在使用shift命令时,默认情况下它会将每个参数变量向左移动一个位置。所以,变量$3

的值会移到2中,变量2中,变量2的值会移到1中,而变量1中,而变量1的值则会被删除(注意,变量$0的值,也

就是程序名,不会改变)。

这是遍历命令行参数的另一个好方法,尤其是在你不知道到底有多少参数时。你可以只操作

第一个参数,移动参数,然后继续操作第一个参数。

这里有个例子来解释它是如何工作的。

$ cat test13.sh

#!/bin/bash 
# demonstrating the shift commandecho 
count=1 
while [ -n "$1" ] 
do      
    echo "Parameter #$count = $1"     
    count=$[ $count + 1 ]     
    shift 
done

测试的输出

$ 
$ ./test13.sh rich barbara katie jessicaParameter 
#1 = rich Parameter 
#2 = barbara Parameter 
#3 = katie Parameter 
#4 = jessica 
$

这个脚本通过测试第一个参数值的长度执行了一个while循环。当第一个参数的长度为零

时,循环结束。测试完第一个参数后,shift命令会将所有参数的位置移动一个位置。

另外,你也可以一次性移动多个位置,只需要给shift命令提供一个参数,指明要移动的位

置数就行了。

$ cat test14.sh

#!/bin/bash 
# demonstrating a multi-position shift 
# echo 

echo "The original parameters: $*" 
shift 2 
echo "Here's the new first parameter: $1"

测试输出:

$ 
$ ./test14.sh 1 2 3 4 5
The original parameters: 1 2 3 4 5 
Here's the new first parameter: 3 
$

通过使用shift命令的参数,就可以轻松地跳过不需要的参数。