我有一个包含很多OPTIONAL参数列表的脚本。有些人有相关的价值观。
如:
.script --first 2012-12-25 --last 2012-12-26 --copy --remove
.script --first 2012-12-25
因此以下案例陈述:
for arg in "$@"
do
case $arg in
"--first" )
START_DATE=$arg;;
"--last" )
END_DATE=$arg;;
"--copy" )
COPY=true;;
"--remove" )
REMOVE=true;;
# ... and so on
esac
done
需要增量$arg+1
类型语句来获取以下arg(在某些情况下)。
这怎么可能?
我也很高兴做一个像.script --first2012-12-25 --last2012-12-26
并且不确定如何继续那里。
答案 0 :(得分:20)
您可以同时允许--a = arg或-a arg选项:
START_DATE="$(date '+%Y-%m-%d')"; LAST_DATE="$(date '+%Y-%m-%d')"; while [[ $# -gt 0 ]] && [[ "$1" == "--"* ]] ; do opt="$1"; shift; #expose next argument case "$opt" in "--" ) break 2;; "--first" ) START_DATE="$1"; shift;; "--first="* ) # alternate format: --first=date START_DATE="${opt#*=}";; "--last" ) LAST_DATE="$1"; shift;; "--last="* ) LAST_DATE="${opt#*=}";; "--copy" ) COPY=true;; "--remove" ) REMOVE=true;; "--optional" ) OPTIONAL="$optional_default";; #set to some default value "--optional=*" ) OPTIONAL="${opt#*=}";; #take argument *) echo >&2 "Invalid option: $@"; exit 1;; esac done
注意--optional参数使用默认值,如果不使用“=”,否则它以正常方式设置值。
答案 1 :(得分:1)
在每个shift
语句的末尾使用case
。
来自bash
手册:
shift [n]
n + 1 ...的位置参数重命名为$ 1 ....数字$#表示的参数由$# - n + 1表示 未设置。 n必须是小于或等于$#的非负数。如果 n为0,不更改参数。如果没有给出n,则假设 如果n大于$#,则位置参数不是 改变。如果n大于,则返回状态大于零 $#或小于零;否则为0。
答案 2 :(得分:1)
如果您有多个选项,尤其是值与没有值的选项混合的选项,请让getopts为您完成工作。
答案 3 :(得分:0)
$@
是一个数组,&不是一个简单的变量。
您可以将其捕获到本地变量x=("$@")
&然后使用索引为0 to ($# - 1)
的数组x。
要访问单个元素,请使用${x[$i]}
。但是,您无法直接使用${@[$i]}
。
因此,不是for arg in "$@"
循环,而是i=0; while [ $i -lt $# ]; do
循环。
答案 4 :(得分:0)
getopts似乎没有可选参数。否则很棒。
我的解决方案
循环$@
并将变量设置为x=$arg
做案例切换该变量(而不是arg)
适用于--startdate 2012-12-25 --enddate 2012-12-29
但不适用于没有以下参数的--remove
。
因此将东西(不太可能的参数)添加到arg字符串上。
留下以下
argc="$@ jabberwhocky"
echo $argc
x=0
# x=0 for unset variable
for arg in $argc
do
case $x in
"--start" )
STARTDATE=$arg ;;
"--end" )
ENDDATE=$arg ;;
"--copy" )
COPY=true;;
"--remove" )
REMOVE=true;;
......依旧......
esac
x=$arg
done