【问题标题】:grabbing all arguments after nth argument and concatenating them together in bash在第 n 个参数之后获取所有参数并在 bash 中将它们连接在一起
【发布时间】:2012-06-24 22:03:45
【问题描述】:

所以我有一个 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;

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

给定示例give testing stuff@things.com 1 2 3 4 5$entList 的最终值应为: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 个参数保存在变量中:var1="$1"; var2="$2"; var3="$3",然后使用 shift 3 删除前 3 个参数,然后使用 "$*" 创建一个包含其他参数的字符串,空格分隔:rest="$*".

标签: string bash command-line arguments


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    使用子数组跳过前三个参数:

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

    【讨论】:

    • 为了清楚一点,IFS 的赋值和以* 为下标的引用数组会导致IFS 内容的第一个字符在数组的每个元素之间输出.
    【解决方案3】:

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

    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"
    

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

    【讨论】:

      猜你喜欢
      • 2016-09-22
      • 2013-12-14
      • 2019-07-07
      • 2012-02-21
      • 1970-01-01
      • 2010-12-02
      • 2012-08-30
      • 2022-01-25
      • 2019-01-28
      相关资源
      最近更新 更多