bash的论点案例中的$ args @(bash argument case for args in

2019-08-04 20:23发布

我有一个可选的参数一长串的脚本。 一些有关联的值。

如:

.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

和不知道如何继续存在。

Answer 1:

您可以允许两个--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参数使用默认值,如果“=”没有被使用,否则将在正常方式的价值。



Answer 2:

使用shift在每年年底case声明。

从引用bash手册:

移[n]的

从N + 1的位置参数...被重命名为$ 1 ....由数字$#降至$#表示参数 - N + 1都没有设置。 n必须小于或等于$#的非负数。 如果n为0,没有参数的改变。 如果n没有给出,它被假定为1,如果n大于$#大,位置参数不会改变。 返回状态是大于零,如果n大于$#或小于0; 否则为0。



Answer 3:

如果你有一个以上的选项,尤其是与选择混合值的选项没有价值,让getopts的做的工作适合你。



Answer 4:

$@是一个数组,&不是一个简单的变量。

你可以把它捕捉到一个局部变量为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循环。



Answer 5:

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


文章来源: bash argument case for args in $@
标签: bash shell