如何修复从 getopt 收到的参数?

如何修复从 getopt 收到的参数?

我的脚本中有以下命令:

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

相关内容