bash:在case语句中,转到其他case语句
我正在尝试编写一个脚本,其中使用选项操纵变量,但如果没有指定选项,则会有快捷方式。例如,我有bash:在case语句中,转到其他case语句,bash,Bash,我正在尝试编写一个脚本,其中使用选项操纵变量,但如果没有指定选项,则会有快捷方式。例如,我有添加、显示、设置、和删除,但如果我没有指定其中任何一项,则会解释输入以确定要执行的操作: 脚本键是脚本显示键 script key=value是script set key=value 我为选项编写了一个case语句,但在catchall中,是否可以说“转到案例X” 编辑 我想到了: case $1 in add) #blah;; delete) #bl
添加
、显示
、设置
、和删除
,但如果我没有指定其中任何一项,则会解释输入以确定要执行的操作:
是脚本键
脚本显示键
是script key=value
script set key=value
case
语句,但在catchall中,是否可以说“转到案例X”
编辑
我想到了:
case $1 in
add)
#blah;;
delete)
#blah;;
set|*=*)
#blah;;
show|*)
#blah;;
esac
它几乎可以工作,但现在如果没有最后一个参数(即我只执行script
),它将尝试运行script show
尝试:
case $1 in
add)
#blah;;
show|*)
#blah;;
set|*=*)
#blah;;
delete)
#blah;;
*)
echo "FAILURE!!!"
exit 1
esac
我建议您的代码结构如下:
if [[ -z $1 ]]; then
echo "FAILURE!!!"
exit 1
fi
case $1 in
add)
#blah;;
set|*=*)
#blah;;
delete)
#blah;;
show|*)
#blah;;
esac
i、 e.在点击case
语句之前失败,并使用|
组合每个case的模式。您可以使用“${1?arg needed}”
而不是case
开头的$1
使脚本在未提供$1
时失败
case "${1?arg needed}" in
add)
echo "add";;
delete)
echo "delete";;
set|*=*)
echo "set";;
show|*)
echo "show";;
esac
对此进行测试:
bash ./script
-bash: 1: arg needed
bash ./script foobar
show
bash ./script abc=123
set
抱歉,我没有看到您的upate:-)
*
与空字符串匹配?*
不会。因此,如果我将大小写更改为show |?*)
我可以使用标准的*)
catchall将其保留为单个大小写?i、 它应该是。不过,我并不完全喜欢走捷径。如果您有一个名为show
的键怎么办?这与我有一个关键字namesadd
、delete
或set
的问题是一样的。在这3种情况下,用户必须使用script show[key]
,并且show
快捷方式将无效,这很有意义。不过,出于好奇,if[[-z$1]]
和if[$#-lt 2]]
之间有什么区别吗?$1
可以解释为空字符串:somecommand”“a b c d e f g h i
。在这里,$1
是空的,但是$#
比2大得多。@ewook chepner说的话!)任何$1
值,而不是添加
将进入您的显示|*)
分支;换句话说:永远不会到达所有剩余的分支。
bash ./script
-bash: 1: arg needed
bash ./script foobar
show
bash ./script abc=123
set