Linux命令行与shell编程笔记-13处理用户输入

本文介绍Shell脚本中处理用户输入的方法,包括位置参数、特殊参数变量、移动数据、处理选项等内容,并详细讲解getopt和getopts命令的使用。

13章 处理用户输入

位置参数

$0   	程序名,可以对$0使用basename函数
(basename $0),它只返回程序名
$11个参数
${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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值