向shell脚本中传递数据的最基本方式就是命令行参数。允许在运行脚本时向命令添加数据。如:
zzz@ubuntu:~/my_learning$ ./test_cmd 10 20
读取位置参数
bash shell 会将一些称为位置参数的特殊变量分配给输入到命令行中的所有参数。位置参数变量是标准的数字:$0是程序名,$1是第一个参数,$2是第二个参数,以此类推。
如果 shell 脚本中使用命令行参数,但执行时未提供参数,会出现问题。所以在使用参数前一定要检查其中是否存在数据。
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
echo "File name is $0"
if [ -n "$1" ]
then
echo "The \$1 is $1"
else
echo "\$1 未提供."
fi
zzz@ubuntu:~/my_learning$ ./test.sh 10
File name is ./test.sh
The $1 is 10
zzz@ubuntu:~/my_learning$ ./test.sh
File name is ./test.sh
$1 未提供.
zzz@ubuntu:~/my_learning$
特殊参数变量
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
echo "$0 参数个数:$#"
echo "\$* 遍历输出:"
for val in "$*"
do
echo "$val"
done
echo "\$@ 遍历输出:"
for val in "$@"
do
echo "$val"
done
zzz@ubuntu:~/my_learning$ ./test.sh 10 20
./test.sh 参数个数:2
$* 遍历输出:
10 20
$@ 遍历输出:
10
20
zzz@ubuntu:~/my_learning$
shift 移动变量
shift 命令可以移动操作命令行参数: $3的值赋值给$2,$2的值赋值给$1,$1的值删除。
count=1
while [ -n $1 ]
do
echo "Parameter$count is $1"
count=$[ $count + 1 ]
shift
done
命令行的选项是指,在执行命令时同时提供的单破折号后面的单字母,能改变命令的行为。
getopts 命令内建于bash shell。getopts 命令的格式如下:
getopts optstring variable
有效的字母都会列在 optstring 中,如果选项字母要求有参数值,就在字母后加 “:” 。如果命令行提供了 optstring 中没有的参数,将会输出错误信息,可以在 optstring 前添加 “:” 来去掉错误信息。
getopts 会将当前参数保存在 variable 中。getopts 命令会用到两个环境变量。如果选项需要跟一个参数值,参数值将保存在OPTARG环境变量。OPTIND环境变量保存了参数列表中 getopts 正在处理的参数位置,这样可以在处理完选项之后继续处理其它命令行参数。
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
echo
while getopts :ab:c opt
do
case "$opt" in
a) echo "deal -a option";;
b) echo "deal -b option, with value $OPTARG";;
c) echo "deal -c option";;
*) echo "Unknow option";;
esac
done
zzz@ubuntu:~/my_learning$ ./test.sh -ab b_value -c
deal -a option
deal -b option, with value b_value
deal -c option
zzz@ubuntu:~/my_learning$
基本的读取用户输入
read 命令从标准输入或另一个文件描述符中接受输入。在收到输入后,read命令会将数据放进一个变量。
read -p 提示信息
read -t 指定一个计时器,指定等待输入的秒数,到期后,返回一个非零退出状态码
read -s 在显示器上不显示输入
zzz@ubuntu:~/my_learning$ cat test1.sh
#!/bin/bash
read -p "输入一个字符串: " str
echo "str is $str"
zzz@ubuntu:~/my_learning$ ./test1.sh
输入一个字符串: zz
str is zz
zzz@ubuntu:~/my_learning$
可以为 read 指定多个变量。
zzz@ubuntu:~/my_learning$ cat test1.sh
#!/bin/bash
read -p "输入一个名字: " first last
echo "Name is $first$last"
zzz@ubuntu:~/my_learning$ ./test1.sh
输入一个名字: z zz
Name is zzz
zzz@ubuntu:~/my_learning$
如果在 read 命令行中不指定变量。read 命令将会把接受到的所有数据都放进特殊环境变量 REPLY 中。
zzz@ubuntu:~/my_learning$ cat test1.sh
#!/bin/bash
read -p "输入一个名字: "
echo "Name is $REPLY"
zzz@ubuntu:~/my_learning$ ./test1.sh
输入一个名字: z zz
Name is z zz
zzz@ubuntu:~/my_learning$
read 命令也可以读取 Linux 文件中保存的数据。每次调用 read 命令,都会从文件中读取一行文本,当文件中没有内容时,read 退出并返回非零退出状态码。
zzz@ubuntu:~/my_learning$ cat files
This is Line1.
This is Line2.
This is Line3.
This is Line4.
zzz@ubuntu:~/my_learning$ cat test2.sh
#!/bin/bash
cat files | while read line
do
echo "Read: '$line'"
done
echo "Read Finished."
zzz@ubuntu:~/my_learning$ ./test2.sh
Read: 'This is Line1.'
Read: 'This is Line2.'
Read: 'This is Line3.'
Read: 'This is Line4.'
Read Finished.
zzz@ubuntu:~/my_learning$