getopt
getopt 可以处理命令行参数
命令行参数有
-
选项参数
-
短选项
-
长选项
-
带值短选项
-
带值长选项
-
-
非选项参数
- 普通参数
这里说的非选项参数就是普通参数
示例
短选项
./test.sh -v
./test.sh -a -b
像 -v -a -b
这种都是短选项
长选项
./test.sh --version
./test.sh --about --break
像 --version --about --break
这种就是长选项
带值短选项
./test.sh -a hello
其中 -a hello
是带值短选项,hello是-a选项的值
带值长选项
./test.sh --app hello
其中 --app hello
是带值短选项,hello是 -app 选项的值
非选项参数
./test.sh a b c
这里有3个参数 a b c
,属于非选项参数
使用
test.sh
options=$(getopt -o ab --long ccc,ddd -- "$@")
echo $options
其中$()
表示执行命令 getopt -o ab --long c,d -- "$@"
-o ab
: 这里-o
表示短选项(short options),ab
是有效的短选项列表。每个字母代表一个可用的短选项。这里有两个短选项,a
和b
。--long ccc,ddd
: 这里--long
表示长选项(long options),ccc,ddd
是有效的长选项列表。每个长选项由逗号,
分隔,c
cc 和ddd
是有效的长选项。--
: 这是一个特殊的标记,它告诉getopt
在解析选项和参数时停止。在--
之后的内容都被视为参数而不是选项"$@"
: 这是一个特殊的变量,它包含所有传递给脚本的参数。"$@"
保留了参数中的空格和引号。
比如我们输入
./test.sh -a -b --ccc --ddd 1 2 3
输出
-a -b --ccc --ddd -- '1' '2' '3'
-a -b --ccc --ddd
: 表示我们定义的短选项和长选项 ,--
后面的是普通参数 1 2 3
再修改下test.sh
options=$(getopt -o ab::c: --long ccc,ddd: -- "$@")
echo $options
我们-o
指定的短选项: ab::c:
a
: 没有冒号,表示指示-a后面不需要任何参数b::
:有两个冒号,表示后面的参数是可选的c:
:有一个冒号表示后面必选一个参数值
--long
指定的长选项 ccc,ddd:
和短选项一样,有一个冒号表示后面必须跟一个参数
./test.sh -b hello --ddd 1212
-b '' --ddd '1212' -- 'hello'
可以看到-b
指定了一个hello值但是把hello识别成了普通参数,如果时可选参数,段选项和长选项有不同的指定方式
./test.sh -bhello --ddd=1212
-b 'hello' --ddd '1212' --
可以看到-bhello
,hello参数需要紧贴-b
选项,而长选项的可选项使用 =
来指定参数
实战
这里引入连个命令
shift
:参数全部左移set -- "string"
:重新设置命令行参数eval
:eval
是一个用于在Shell脚本中执行字符串作为Shell命令的内置命令。它的作用是将传递给它的参数当作Shell命令进行解析和执行。eval
命令的使用场景通常是在需要动态生成Shell命令的情况下。通过将命令保存在字符串中,可以在运行时根据不同的情况动态生成不同的Shell命令,然后使用eval
执行这些命令。
使用test.sh举例
echo $@
eval set -- "-a hello --app app"
echo $@
shift 1
echo $@
运行
./test 1 2 3
输出
1 2 3
-a hello --app app
hello --app app
eval执行了set -- "-a hello --app app"
这个命令
set – 指定了新的命令行参数 -a hello --app app
随后shift
左移了所有参数 也就是 shift 2就是左移两下
#!/bin/bash
# 处理参数
options=$(getopt -o h --long help,app: -- "$@")
eval set -- "$options"
while true; do
# echo $1;
case $1 in
-h|--help)
echo help;
;;
--app)
echo '--app的参数为'"$2"
shift 1
;;
--)
echo "剩下了普通参数,匹配终止"
shift 1
break
;;
*)
echo "未知选项"
# exit
break
;;
esac
shift
done
echo "剩余参数" "$@"
运行
./test.sh -h --app app 1 2 3
运行结果
help
--app的参数为app
剩下了普通参数,匹配终止
剩余参数 1 2 3