我的脚本中有以下命令:
set -- `getopt -q agvc:l:t:i: "$@"`
...
while [ -n "$1" ]
do
-i) TIME_GAP_BOOT=$2
shift ;;
...
sleep $TIME_GAP_BOOT
使用 调用脚本时-i 2
,出现错误
sleep: invalid time interval `\'2\''
我究竟做错了什么?如何正确格式化参数?
答案1
内置的 bashgetopts
更容易使用。如果您正在使用bash
,则应该使用它而不是getopt
。
GNUgetopt
设计用于处理其中包含空格和其他元字符的参数。为此,它会生成一个带有 bash 样式引号(或 csh 样式引号,具体取决于选项-s
)的结果字符串。您需要安排解释引号,这需要使用eval
. (我有没有提到 bash 内置函数getopts
更好?)。
以下示例来自 getopt 发行版;我与此无关。 (它应该出现在你机器上的某个地方;对于 ubuntu 和 debian,它显示为/usr/share/doc/util-linux/examples/getopt-parse.bash
。我只引用几行:
# Note that we use `"$@"' to let each command-line parameter expand to a
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of getopt.
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n 'example.bash' -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
除了示例注释所指向的引号之外,查看 也很重要eval
,它通常不受欢迎。
相比之下,bash 内置命令getopts
不需要eval
,而且非常简单;它基本上模拟了标准 C 库调用:
while getopts agvc:l:t:i: opt; do
case "$opt" in
i) TIME_GAP_BOOT=$OPTARG;;
# ...
esac
done