我有一个可选的参数一长串的脚本。 一些有关联的值。
如:
.script --first 2012-12-25 --last 2012-12-26 --copy --remove
.script --first 2012-12-25
因此,接下来的case语句:
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
和不知道如何继续存在。
您可以允许两个--a =精氨酸或者多一点的工作-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参数使用默认值,如果“=”没有被使用,否则将在正常方式的价值。
使用shift
在每年年底case
声明。
从引用bash
手册:
移[n]的
从N + 1的位置参数...被重命名为$ 1 ....由数字$#降至$#表示参数 - N + 1都没有设置。 n必须小于或等于$#的非负数。 如果n为0,没有参数的改变。 如果n没有给出,它被假定为1,如果n大于$#大,位置参数不会改变。 返回状态是大于零,如果n大于$#或小于0; 否则为0。
如果你有一个以上的选项,尤其是与选择混合值的选项没有价值,让getopts的做的工作适合你。
$@
是一个数组,&不是一个简单的变量。
你可以把它捕捉到一个局部变量为x=("$@")
然后使用数组x具有指数为0 to ($# - 1)
访问各个元素,用${x[$i]}
你不能直接使用${@[$i]}
但是。
因此,而不是for arg in "$@"
循环,你将有i=0; while [ $i -lt $# ]; do
i=0; while [ $i -lt $# ]; do
i=0; while [ $i -lt $# ]; do
循环。
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