在第n个参数之后抓取所有参数并在bash中将它们连接在一起

时间:2012-06-22 15:12:01

标签: string bash command-line arguments

所以我有一个bash脚本需要接受任意数量的命令行参数并将它们放入一个字符串

用户输入内容的示例:

give <environment> <email> <any number of integers separated by spaces>
give testing stuff@things.com 1 2 3 4 5

我希望得到从$ 3到$#的所有参数,并将它们连成一个字符串。

我的(可能很糟糕)解决方案现在是

if [ $# -gt 3 ]
then
    env="env="$1
    email="email="$2
    entList=""

    for i in {3..$#}
    do
        if [ $i -eq 3 ]
            then
                    entList=$3
                    shift
            fi;
            if [ $i -gt 3 ]
            then
                    entList=$entList","$3
                   shift
            fi;
     done
fi;

我处理只有三个参数有点不同的情况,并且一个工作正常。

示例$entList给出的give testing stuff@things.com 1 2 3 4 5的最终值应为:1,2,3,4,5

现在,当我运行这个时,我得到以下错误:

/usr/local/bin/ngive.sh: line 29: [: {3..5}: integer expression expected
/usr/local/bin/ngive.sh: line 34: [: {3..5}: integer expression expected

第29和34行是:

line 29: if [ $i -eq 3 ]
line 34: if [ $i -gt 3 ]

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:6)

你走在正确的轨道上。这是我的建议:

if [ $# -ge 3 ]; then

  env="$1"
  email="$2"
  entlist="$3"

  while shift && [ -n "$3" ]; do
    entlist="${entlist},$3"
  done

  echo "entlist=$entlist"

else

  echo "Arguments: $*"

fi

请注意,变量应始终放在 in 引号内。我不确定你为什么要设置env=env=$1,但我怀疑如果你想稍后再循环这个值,你应该以编程方式进行,而不是通过评估变量就好像它是一个语句,如果是你的计划。

答案 1 :(得分:4)

使用子阵列跳过前三个参数:

all=( ${@} )
IFS=','
threeplus="${all[*]:3}"

答案 2 :(得分:2)

您收到这些错误消息的原因是:

for i in {3..$#}

大括号扩展在参数扩展之前执行,因此以下if语句被评估为:

if [ {3..$#} -eq 3 ]

无效。

更改for语句以使用C样式:

for ((i = 3; i <= $#; i++))

使用此样式进行整数比较:

if (( $# > 3 ))

if (( i == 3 ))

if (( i > 3 ))

将参数放在引号内:

env="env=$1"
email="email=$2"

entList="$entList,$3"

虽然引号不是必需的,因为在分配的右侧没有执行分词,而且你没有分配特殊字符,如空格,分号,管道等。