在开始学习本节之前,我们先来看一个Shell脚本例子。
[peter@ibi-genome shell]$ cat pos_param.sh #!/bin/bash echo $0 echo $1 echo $2 [peter@ibi-genome shell]$ sh pos_param.sh pos_param.sh [peter@ibi-genome shell]$ sh pos_param.sh a pos_param.sh a [peter@ibi-genome shell]$ sh pos_param.sh a b pos_param.sh a b [peter@ibi-genome shell]$ sh pos_param.sh a b c pos_param.sh a b
程序pos_param.sh中的$0、$1、$2就是位置变量,其中$0的值是脚本文件名,$1的值是第一个位置参数(也叫命令行参数,因为是运行命令的时候跟在脚本名后面的参数),$2的值是第二个位置参数,以此类推。
位置变量不能直接赋值,其值除了从命令行参数读取,还可以用set命令进行设置:
[peter@ibi-genome shell]$ cat pos_param.sh #!/bin/bash echo $0 echo $1 echo $2 set Hello world echo $1 echo $2 [peter@ibi-genome shell]$ sh pos_param.sh a b pos_param.sh a b Hello world
位置参数可以用shift命令移动:
[peter@ibi-genome shell]$ cat pos_param.sh #!/bin/bash echo "1:$1 2:$2 3:$3 4:$4 5:$5" shift echo "1:$1 2:$2 3:$3 4:$4 5:$5" shift 2 echo "1:$1 2:$2 3:$3 4:$4 5:$5" [peter@ibi-genome shell]$ sh pos_param.sh a b c d e 1:a 2:b 3:c 4:d 5:e 1:b 2:c 3:d 4:e 5: 1:d 2:e 3: 4: 5:
上例中,有5个位置参数,Shell脚本中第一个shift命令没有参数,从执行结果看,所有的位置参数向左移动一个位置,第一个位置参数被挤出。下面一个shift命令有1个参数2,所有位置参数向左移动2个位置,最前面两个被挤出(b和c,a已经被上一个shift命令挤出去了)。
利用位置参数可以方便地把Shell脚本执行需要的数据传进程序,这样不用修改程序代码也可以处理不同的数据。如:
[peter@ibi-genome shell]$ cat sum.sh #!/bin/bash echo $(($1+$2)) [peter@ibi-genome shell]$ sh sum.sh 2 4 6 [peter@ibi-genome shell]$ sh sum.sh 3 5 8
上面的Shell脚本利用位置参数把数字传递给程序中的位置变量,对两个位置变量进行运算并输出他们的和,这样每次运行只需要提供不同的位置参数(命令行参数)即可。例子中用到的算术运算在后面的内容中还要学习。