13章 处理用户输入
位置参数
$0 程序名,可以对$0使用basename函数
(basename $0),它只返回程序名
$1 第1个参数
${10} 第10个参数
每个参数以空格隔开
特殊参数变量
$# 参数数量
${!#} 最后一个参数。花括号({})中不允许使用美元符号,这里使用感叹号(!)
$* 将命令行上提供的所有参数当做1个单词保存
echo $*
$@ 所有参数的集合
for var in $@
移动数据
shift命令,默认将每个参数变量建议,变量$1删除,$0不会被改变
#输出所有参数
while [ -n $1]
do
echo "parameter #$count=$1"
count=$[$count+1]
shift
done
处理选项
#处理简单选项
while [-n $1 ]
do
case "$1" in
-a) echo "Found the -a option" ;;
-b) echo "Found the -b option" ;;
*) echo "$1 is not a option" ;;
esac
shift
done
#分离参数和选项
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found option a";;
-b) echo "Found option b";;
--) shift
break;;#跳出while,而不是case
*) echo "$1 not a option";;
esac
shift
done
for p in $@
do
echo "$p is a param ."
done
- -双破折线表明选项结束
使用opt选项
命令格式:
getopt options optstring parameter
optstring定义了命令行有效地选项字母,还定义哪些选项字母需要参数。在optstring中列出所有选项,带值选项要在字母后加冒号(:),如果参数中包含无效参数,那么会给出错误信息
-q:屏蔽错误报告
在脚本中使用opt较为复杂
getopt ab:cd -a -b pb -cde p1 p2
set命令,会将命令行的参数替换成set命令的命令行的值
set – `getopt ab:cd “$@”`
set -- `getopt a:b:c "$@"`
echo "param = $@"
while [ -n "$1" ]
do
case "$1" in
-a) echo "found option a and param = $2"
shift ;;
-b) echo "found option b and param = $2"
shift ;;
-c) echo "found option c, no param." ;;
--) ;;
*) echo "what's this?"
break ;;
esac
shift
done
getopt命令并不擅长处理带空格的参数值。而且在用户输入出错的情况下,也可能解释出错
使用更加高级getopts
命令格式: getopts optstring variable
getopts用到的两个环境变量
OPTARG:如果选项需要跟着有一个参数值,那么此变量就保存这个参数值
OPTIND:保存getopts正在处理的参数的位置
注意:如果想屏蔽错误消息,需要在optstring前面加冒号,而getopt中是使用-q
getopts将当前参数保存在命令行中定义的variable中
每调用一次getopts,它只处理命令行中的一个参数,处理完所有参数后,它会退出并返回一个大于0的退出状态码
while getopts abc:d opt
do
case $opt in
a) echo "option -a found";;
b) echo "option -b found";;
c) echo "option -c found and param = $OPTARG";;
d) echo "option -d found";;
?) p=$[$OPTIND-1]
echo "what's this? "${!p}
echo "what's this? "$opt;;
esac
done
将选项标准化
选项 描述
-a 显示所有对象
-c 生成一个计数
-d 指定一个目录
-e 扩展一个对象
-f 指定读取数据的文件
-h 显示命令的帮助信息
-i 忽略文本大小写
-l 产生输出的长格式版本
-n 使用非交互模式(批量)
-o 指定将所有输出重定向到的输出文件
-q 以安静模式运行
-r 递归处理目录和文件
-s 以安静模式运行
-v 生成详细输出
-x 排除某个对象
-y 对所有问题回答yes
获得用户输入
read命令,获取标准输入或另一个文件描述符的输入。
read var
read -p"input your name:" name
read -t 5 name#等待输入的秒数
read -n 2 number #指定输入的位数
read -s passwd #隐藏输入的数据不在屏幕显示,保护输入数据
如果在指定命令的后面没有指定变量,收到的数据放入特殊环境变量REPLY中
计时器过期read命令会以非零退出状态码退出,在if中使用要注意
从文件读取,通过cat命令的输出通过管道传给含有read命令的while命令
count=0
cat file | while read line
do
echo "line $count:$line"
count=$[ $count + 1 ]
done
echo "$count line(s) in all."
用管道给read传送数据,将会开启一个子shell,这样在while外再查看$count,会发现它依然为0
参考了http://blog.youkuaiyun.com/su1216/article/details/10019221