我已经复制了代码tutorialspoint 的 getopt 文章并让以下脚本正常工作(有点):
##argument_script.sh
VARS=`getopt -o i::o:: --long input::,output:: -- "$@"`
eval set -- "$VARS"
# extract options and their arguments into variables.
while true ; do
case "$1" in
-i|--input)
case "$2" in
"") MAPPE='/default/input/here/' ; shift 2 ;;
*) MAPPE=$2 ; shift 2 ;;
esac ;;
-o|--output)
case "$2" in
"") OUTPUTFOLDER='/default/input/here/' ; shift 2 ;;
*) OUTPUTFOLDER=$2 ; shift 2 ;;
esac ;;
--) shift ; break ;;
esac
done
echo "${MAPPE}"
echo "${OUTPUTFOLDER}"
#do something here..
也就是说,我有两个可选参数标志-i
/--input
和-o
/ -output
。我目前的脚本有问题:
要覆盖标志的默认值,您需要在标志后面写入所需的值,不带任何空格。示例:如果我想传递/c/
into-i
和/f/
into -o
,我需要将脚本调用为:bash argument_script.sh -i/c/ -o/f/
。注意缺少的空格。如果我要编写bash argument_script.sh -i /c/ -o /f/
变量MAPPE
并将OUTPUTFOLDER
使用默认值。
脚本可以重写吗,所以传入-i
/的参数-o
需要写在空格后面(例子:bash argument_script.sh -i /c/ -o /f/
)
答案1
您所描述的行为是因为您:
的getopt
.只需将您的getopt
行更改为此即可:
VARS=`getopt -o i:o: --long input:,output: -- "$@"`
然而,这是一种非常非常复杂的编写脚本的方式。这是一个更简单的版本(还纠正了一些不好的做法,例如大写变量):
#!/bin/bash
##argument_script.sh
vars=$(getopt -o i:o: --long input:,output: -- "$@")
eval set -- "$vars"
mappe='/default/input/here/'
outputFolder='/default/input/here/'
# extract options and their arguments into variables.
for opt; do
case "$opt" in
-i|--input)
mappe=$2
shift 2
;;
-o|--output)
outputFolder=$2
shift 2
;;
esac
done
echo "mappe: $mappe"
echo "out: $outputFolder"
您现在可以执行以下操作:
$ ./argument_script.sh -i /c/ -o /f/
mappe: /c/
out: /f/
请注意,如果您运行它也可以工作./argument_script.sh -i/c/ -o/f/
。该空间不是必需的,而是允许的。
答案2
不幸的是,这是预期的行为,由getopt(3)
该getopt(1)
实用程序所基于的 GNU 函数实现。从它的联机帮助页(强调我的):
两个冒号表示一个选项带有一个可选参数;如果有文字 在当前
argv
元素中(即与选项名称本身在同一个单词中,例如,-oarg
),则返回optarg
,否则optarg
设置为零。
如果您希望能够在选项及其参数之间使用空格(例如-o value
代替-ovalue
),您必须使其参数非可选的:
,通过在规范中的选项字符后使用单个。