$ @中args的bash参数案例

Gab*_*bow 17 bash shell

我有一个包含很多OPTIONAL参数的脚本.一些有相关的价值观.

如:

.script --first 2012-12-25 --last 2012-12-26 --copy --remove
.script --first 2012-12-25 
Run Code Online (Sandbox Code Playgroud)

因此以下案例陈述:

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
Run Code Online (Sandbox Code Playgroud)

我的问题:

需要增量$arg+1类型语句来获取以下arg(在某些情况下).

怎么可能?

我也很乐意做一个子串 .script --first2012-12-25 --last2012-12-26

而不知道如何继续前进.

Gil*_*ert 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参数使用默认值,否则以正常方式设置值.


Gab*_*bow 1

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;;
Run Code Online (Sandbox Code Playgroud)

... 等等....

    esac
    x=$arg
done
Run Code Online (Sandbox Code Playgroud)