$ @中args的bash参数案例

时间:2012-12-27 23:58:03

标签: bash shell

我有一个包含很多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

这样的子字符串

并且不确定如何继续那里。

5 个答案:

答案 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