我有bash脚本,我希望能够根据调用脚本时传递的选项跳过(即不执行)某些命令。
为了说明我想要完成的任务,我编写了带有if
语句的脚本,基本上完成了同样的事情。
if [ "$1" != "skipA" ]
then
echo "A"
fi
if [ "$1" != "skipB" ]
then
echo "B"
fi
if [ "$1" != "skipC" ]
then
echo "C"
fi
if [ "$1" != "skipD" ]
then
echo "D"
fi
在调用脚本时没有传递参数时,将执行所有四个echo
语句。如果我想跳过其中一个echo语句,我使用skipLETTER
作为第一个参数:
./script.sh skipA
并打印除A
以外的所有字母。它有效,但确实有很多限制 - 对于一个,我不能使用相同的参数($1
)跳过很多部分。我想用选项实现同样的东西,所以我可以输入类似的东西:
./script -skipA -skipD
因此仅打印B
和C
个字母。
我知道我可以使用getopt
或getopts
来实现这一目标,但我找不到任何能够实现我所描述内容的简单用法示例。
答案 0 :(得分:0)
我使用以下算法的代码:
答案 1 :(得分:0)
POSIX标准的getopts不能做长选项,只能做单字符选项,因此你不能将它用于问题中概述的确切界面。
顺便说一下,长选项应该用两个短划线引入,而不是一个,否则没有办法告诉,如果-skipA是单个选项(带有可能的optarg),或者五个捆绑的单字符选项(-x -y
与-xy
相同,两者都与--xy
不同。
继续使用可移植代码(getopts spec)并为跳过选项选择s
,这是一个简短的示例:
#!/bin/sh
contains()
{
case "$1" in
*$2*) return 0 ;;
esac
return 1
}
requested()
{
! contains "$skip" "$1"
}
while getopts s: optname; do
case $optname in
s) skip="$OPTARG" ;;
?) exit 1 ;;
esac
done
if requested A; then
echo A
fi
if requested B; then
echo B
fi
if requested C; then
echo C
fi
if requested D; then
echo D
fi
您可以使用./skip-parts.sh -s AC
和类似的方式对其进行测试。如果没有 optarg ,它会对未知选项和-s
做出反应,其中的消息类似于
./skip-parts.sh: illegal option -- x
./skip-parts.sh: option requires an argument -- s
如果你不喜欢默认的错误信息,你可以通过在冒号(1)前面添加一个冒号,然后在?
情况下给出你自己的(选项)来使它们静音。需要参数案例通过将 optname 设置为冒号来表示...但你说你已经阅读过文档了。