# 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.shbasename就是取文件名,像python中的os.path.basename同样也是从路径中提取文件名。

上面的例子中都是直接默认命令运行时该传递的参数都传递了,但实际往往并非如此,因此需要检验传入的参数,

#!/bin/bash
if [ -n "$3" ];then
    echo Hello $3.
else
    echo arg3 is empty.
fi

(adsbygoogle = window.adsbygoogle || []).push({});