在shell脚本中处理linux输入主要有三种形式:
1)将他们像命令行参数一样处理,通过对应的位置参数来获取对应的输入参数
2)通过getopt和getopts这两个命令
3)通过read命令以交互的方式获取用户的输入参数
1.通过对应的位置参数获取
shell中的位置参数的计算是从0开始的依次往后加1对应用户的输入参数;例如$0对应的是用户的程序名,$1对应的第一个参数,$2为第二个参数,依次类推直到第10个参数以后则应用花括号将对应的位置参数包裹的获取方式为${10}。
$#,$*,[email protected]在为参数中有着特殊的含义:
$#统计输入的参数的总数这个总数不包含程序名
$*将用户的输入所有参数当成一个单词返回
[email protected]将所有变量保存为单个单词。
但是${$#}这中方式获取最后一个输入参数将返回一个错误的值,正确的方式为${!#}
通过shift命令可以将对应参数的参数向前移动一位通过shift可以遍历用户输入的参数
count=1
while [ -n "$1" ]
do
echo "Parameter #$count = $1"
echo "Parameter \$0 #$count=$0"
count=$[ $count + 1 ]
shift
done
shift将$2后一位移动到了$1而$1上的参数将会被删除而不会被移到$0上面。
2)getopt和getopts命令
getopt和getopts允许用户可以按照linux的命令格式输入数据,getopt和getopts的使用格式大体相似。getopt命令将原命令参数格式化传给set命令替换原始的命令行参数。使用的格式如下:
set -- `getopt ab:c "[email protected]"` :表示对应的b选项后面需要带参数
同时getopt是以--符号来区分选项参数和输入的传输的。
getopt参数在获取的过程也还是通过对应的为参数获取的。
对应的事列如下:
set -- `getopt -q ab:c "[email protected]"`
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option";;
-b) param=$2
echo "Found the -b option,with parameter value $param"
shift;;
-c) echo "Found the -c option";;
--) shift
break;;
*)echo "$1 is not an option";;
esac
shift
done
count=1
for param in "[email protected]"
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ]
done
输入-ac –b test1 test2 经getopt格式化后输出为-a -c -b test1 -- test2。
getopts与getopt略有不同。如果选项需要跟一个参数,这个参数将会保存到OPTARG环境变量中。OPTIND环境变量保存了参数列表中getopts正在处理的参数位置。
对应的事列如下:
while getopts ab:c opt
do
case "$opt" in
a) echo "Found the -a option";;
b) echo "Found the -b option,with value $OPTARG";;
c) echo "Found the -c option";;
*) echo "Unknow option: $opt";;
esac
done
shift $[ $OPTIND - 1]
count=1
for param in "[email protected]"
do
echo "Parameter $count:$param"
count=$[ $count + 1 ]
done
3) 通过read命令以交互的方式获取用户的输入参数
read -t 5 -p "Enter a numer:" opt
-t 设置超时时间
-p输出交互字符串提示符,用户的输入将被保存到opt变量中。如果没有设置opt变量,用户的输入变量将会保存到$REPLY环境变量中
-s将屏蔽用户输入的回想。
count=1
cat testcommand.sh | while read line
do
echo "Line $count: $line"
count=$[ $count + 1 ]
done
用read来读取文件里保存的数据,read命令每次会从文件中读取一行文本。