我正在尝试学习案例,因为我正在编写一个功能齐全的脚本。
我从下面的
开始#!/bin/sh
case $@ in
-h|--help)
echo "You have selected Help"
;;
-B|-b)
echo "You have selected B"
;;
-C|-c)
echo "You have selected C"
;;
*)
echo "Valid Choices are A,B,C"
exit 1
;;
esac
我想使用其中两个选项:
./getopts.sh -h -c
但我得到了这个结果 有效选择是A,B,C
请你帮忙,让我知道我做错了什么?
我想构建一个脚本,如果你输入一个选项会做一些事情但是如果你输入多个就会做多件事。
另外我如何解析$ 1这个脚本作为surley哪个选项我先输入(-h)将是1美元?
谢谢!
答案 0 :(得分:11)
试试这个
#!/bin/sh
usage() {
echo `basename $0`: ERROR: $* 1>&2
echo usage: `basename $0` '[-a] [-b] [-c]
[file ...]' 1>&2
exit 1
}
while :
do
case "$1" in
-a|-A) echo you picked A;;
-b|-B) echo you picked B;;
-c|-C) echo you picked C;;
-*) usage "bad argument $1";;
*) break;;
esac
shift
done
答案 1 :(得分:6)
使用getopt
或getopts
是更好的解决方案。但要回答您的直接问题,$@
是所有您的参数,所以-h -c
,它与您的case语句中的任何单参数模式都不匹配。您仍然需要迭代您的参数
for arg in "$@"; do
case $arg in
....
esac
done
答案 2 :(得分:0)
解析位置参数,例如...... $ 1,只需在stmt中使用$ 1,然后在结尾处...使用shift将第二个arg推送到$ 1同样。
我也会将案例stmt放入while循环或更好的fxn,以便我可以为两个选项或选项数量运行两次..........
$#会让你知道有多少选项/参数。