# bash shell命令行参数
bash shell
会将一些称为位置参数positional parameter
的特殊变量分配给输入到命令行中的所有参数。位置参数变量是标准的数字,$0
是程序名, $1
是第
一个参数, $2
是第二个参数,依次类推。
# 常规使用
#!/bin/bash
factorial=1
for (( number = 1; number <= $1 ; number++ ))
do
factorial=$[ $factorial * $number ]
done
echo The factorial of $1 is $factorial
# ./arg.sh 3
# The factorial of 3 is 6
上面的例子是使用了一个命令行参数,在需要输入更多的命令行参数,则每个参数都必须用空格分开。
#!/bin/bash
total=$[ $1 * $2 ]
echo The first parameter is $1.
echo The second parameter is $2.
echo The total value is $total.
# ./arg.sh 3 2
# The first parameter is 3.
# The second parameter is 2.
# The total value is 6.
前面的两个例子,命令行参数使用的都是数字,此外,也可以在命令行上用文本字符串。
#!/bin/bash
echo Hello $1.
# ./arg.sh shell
这里,值得注意的是当参数中有引号或空格时需要使用双引号,否则命令会出错。
# error
./arg.sh Shell's Friend
# right
./arg.sh "Shell's Friend"
将文本字符串作为参数传递时,引号并非数据的一部分。
如果脚本需要的命令行参数不止9个,仍然可以处理,但是需要稍微修改一下变量名。在第9个变量之后,必须在变量数字周围加上花括号,比如 ${10}
。
# 获取脚本名字
前面介绍过,$0
命令行参数可以取到脚本名字,但是在一些特殊的情况下,这会得到意想不到的结果。
#!/bin/bash
echo shell name: $0
bash arg.sh
# shell name: arg.sh
直接通过上面的命令,执行$0
所得结果是arg.sh
。再看下面,
./arg.sh
# shell name: ./arg.sh
/home/rob/arg.sh
# /home/rob/arg.sh
可以看到当使用脚本文件路径直接运行时,$0
命令取的是完整的路径,而非脚本名。要实现这个功能要借助shell
中的另一个命令basename
。
#!/bin/bash
echo shell name: $(basename $0)
# shell name: arg.sh
如此,上面的几种方式执行后的结果都是arg.sh
。basename
就是取文件名,像python
中的os.path.basename
同样也是从路径中提取文件名。
上面的例子中都是直接默认命令运行时该传递的参数都传递了,但实际往往并非如此,因此需要检验传入的参数,
#!/bin/bash
if [ -n "$3" ];then
echo Hello $3.
else
echo arg3 is empty.
fi