您的位置:首页 > 运维架构 > Linux

【Linux】命令行选项和参数处理

2019-07-01 20:52 71 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Sudley/article/details/94405614

Linux下的Shell命令行选项和参数的处理一般可以用getopt、getopts和while-case等方式处理。

简单的while加case

一般选项和参数定义通常是-v后面接一个版本的参数以及-v后面不接参数两种
参考代码
cat parse_args.sh

#!/bin/bash
export VERSION=""
export PPT="NO"

parse_args(){
echo "start parse_args"
while [ -n "$1" ]
do
case "$1" in
-v)
shift
if [ -n "$1" ];then
export VERSION="$1"
else
echo "ERROR:VERSION is empty"
exit 1
fi
shift
;;
-p)
export PPT="YES"
shift
;;
*)
echo "wrong args:$*"
exit 1
;;
esac
done
}

parse_args $@
echo $VERSION
echo $PPT

上述echo格式可以参考另外一篇博文进行标准化输出
https://blog.csdn.net/Sudley/article/details/93914507
上述代码要点介绍:
shift:参数进行左移,$2移到$1,也可加数字shift 2表示参数左移两位$3移到$1。

∗和*和∗和@的区别:
“∗"会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则"*" 会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则"∗"会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则"“为空,如果有两个位置参数并且IFS为空格时,”$“相当于”$1 2"。"2"。 "2"。"@” 会把所有位置参数当成一个单独的字段,如果没有位置参数(KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲为0),则"@“展开为空(不是空字符串,而是空列表),如果存在一个位置参数,则”$@“相当于”1",如果有两个参数,则"1",如果有两个参数,则"1",如果有两个参数,则"@“相当于”$1" "2"等等。一般可以通过用for循环展开2"等等。 一般可以通过用for循环展开2"等等。一般可以通过用for循环展开*和$@参数来对比他们之间的区别

[root@localhost /home/Sudley]#cat test.sh
#!/bin/bash
for i in "$*"
do
echo $i
done
echo "############################"
for i in "$@"
do
echo $i
done
[root@localhost /home/Sudley]#sh test.sh a b c
a b c
############################
a
b
c

while、case组合的选项参数处理优缺点
优点:简单粗暴,用我们已知的while循环和case分支就可以实现选项处理。
缺点:选项出错不感知,比如上述代码我们期待的输入应该是./parse_args.sh -v 2019 -p,但是当输入./parse_args.sh -v -p时也不会出错,此时-p就赋值给了VERSION变量。这样需要通过其他方式来检查我们的参数输入是否符合要求。

getopts

比较直观,一眼看到支持哪些选项,选项后面接:代表需要接参数,参数保存在$OPTARG变量中。

#!/bin/bash
echo $@ |\
while getopts 'a:bcd:e' OPT
do
case $OPT in
a)
echo $OPTARG
;;
b)
echo "b"
;;
c)
echo "c"
;;
d)
dd="$OPTARG"
echo $dd
;;
e)
echo "end"
;;
?)
echo "unknow option"
exit 1
;;
esac
done

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: