阅读背景:

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

来源:互联网 

13章 处理用户输入

位置参数

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

参考了https://blog.csdn.net/su1216/article/details/10019221


程序名,可以对

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

参考了https://blog.csdn.net/su1216/article/details/10019221


使用basename函数
basename



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: