有时还会需要脚本能够与使用者交互。bash shell提供了一些不同的方法来从用户处获得数据,
包括命令行参数,命令行选项,以及直接从键盘读取输入的能力。
14.1 命令行参数
就是添加在命令后的数据
比如: ./addem 10 30
10 和 30 就是传递的命令行参数
14.1.1 读取参数
bash shell会将一些称为位置参数的特殊变量分配给输入到命令行中的所有参数。
比如: $0:程序名 $1:第一个参数 $2:第2个参数 …… 以此类推直到第九个参数。
每个参数都必须用空格分开。可以使用数字也可以使用文本。如果文本有空格,需要用引号括起来,(单引号双引号均可)
若参数不止9个,第十个以后的需要加花括号处理。比如${10}:第十个参数 ${11}:第11个参数。这样就可以添加任意多的参数了。
14.1.2 读取脚本名
$0 参数获取shell在命令行启动的脚本名。
也就是说 同一个脚本test。 ./test 运行 和 /xcy/home/test 这样会得到不同的结果。
basename会返回不包含路径的脚本名。比如 name=$(basename $0)
例子:
1 #!/bin/bash
2 # canshu test
3 echo "Command Name is $0"
4 name=$(basename $0)
5 echo "file name is $name"
6 echo "Hi, My name is $1, I am $2, I am come from $3"
7 echo "Param4: $4, Param5:$5 ...... Param10:${10}, Param11:${11}"
运行:
14.1.3 测试参数
如果脚本中使用了命令行参数,脚本不加参数运行可能会出问题。
可以先判断参数是否存在。使用前此案检查是否存在数据
使用 –n 来检查命令行参数是否有数据。
例子:
1 #/bin/bash
2 # check param
3 if [ -n "$1" ] # 需要用双引号括起来
4 then
5 echo "hello, $1, nice to meet you"
6 else
7 echo "sorry, you are illegality"
8 fi
运行:可以这样
./test2
./test2 xiaochongyong
14.2 特殊参数变量 14.2.1 参数统计
$# 可以统计参数个数,统计输入了多少个参数
假如有5个参数,那么 $# 会是5。 那么${$#}就应该是最后一个参数。然而其实并不是这样。
其实不能在花括号里面是有美元符。必须换成感叹号。${!#}
14.2.2 抓取所有的变量
抓取命令行上提供的所有参数。
$* 和 $@ 变量可以用来访问所有的参数。
$*:将命令行上提供的所有参数当做一个单词保存,可以看做一个整体
$@:将命令行上提供的所有参数当做同一字符串中的多个独立的单词。可以用for遍历所有的参数值。
例子: 这里的反斜杠是为了转义美元符
1 #!/bin/bash
2 # test
3 echo "Param count:$#"
4 echo "Last Param:${!#}"
5 echo "param \$*:$*"
6 echo "param \$@:$@"
7 count=1
8 for param in "$*" # for param in $*, no ""。如果没有双引号,效果一样
9 do
10 echo " Param \$* #$count = $param"
11 count=$[ $count + 1 ]
12 done
13
14 count=1
15 for param1 in "$@"
16 do
17 echo " Param \$@ #$count = $param1"
18 count=$[ $count + 1 ]
19 done
运行:./test 1 2 3 4 5
注意第10行和第17行的输出的区别
14.3 移动变量
bash shell的shift工具命令能操作命令行参数。
shift命令会根据它们的相对位置来移动命令行参数。
如何使用:默认情况下将每个参数变量向左移动一个位置。
$3移动到$2, $2移动到$1。$1的值就被丢弃了,$0的值不会被改变。
1 #!/bin/bash
2 # shift test
3 count=1
4 while [ -n "$1" ]
5 do
6 echo "Param$count = $1"
7 count=$[ $count + 1 ] # 这个是数学运算
8 shift
9 done
运行: ./test 1 2 3 4 5 6 7
还可以一次性移动多个, shift n n表示移动位置数
14.4 处理选项
选项:跟在单破折线后面的单个字母,它能改变命令的行为。比如 ls -a
14.4.1 查找选项1.处理简单选项。
比如下面的例子:
1 #!/bin/bash
2
3 if [ -n "$1" ]
4 then
5 case "$1" in
6 -a) echo "this is -a option";;
7 -b) echo "this is -b option";;
8 -c) echo "this is -c option";;
9 -d) echo "this is -d option";;
10 esac
11 else
12 echo "no param"
13 fi
运行:
./test -a
./test –b
2. 分离参数和选项
如果需要在shell脚本中同时使用选项和参数。
解决方案是用特殊字符来将二者分开。
shell会用双破折线来表明选项列表结束。在双破破折现之后脚本就可以放心的将剩下的命令当做参数了。而不是选项
运行脚本时, -- 之前的是选项和选项的参数。 -- 的之后就是命令行参数。
3. 处理带值的参数
有时候选项会带上一个额外的参数值。
由于要处理的选项是$1 ,那么参数就在它后面,就是$2.
例子:
1 #!/bin/bash
2 echo
3 while [ -n "$1" ]
4 do
5 case "$1" in
6 -a) echo "Found the -a option";;
7 -b) value=$2 # 这里处理选项参数
8 echo "Found the -b option, Param = $value"
9 shift;;
10 -c) echo "Found the -c option";;
11 --) shift
12 break;;
13 *) echo "$1 is not option";;
14 esac
15 shift
16 done
17 # 上面处理选项,下面是处理命令行参数
18 count=1
19 for param in $@
20 do
21 echo "Param$count = $param"
22 count=$[ $count + 1 ]
23 done
运行: