我已经从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/
进入-i
和/f/
进入-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/
)
您描述的行为是因为您:
的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/
. 空间不是必需的,它是允许的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句