【问题标题】:concatenate variable into single variable separated by comma with for loop用for循环将变量连接成用逗号分隔的单个变量
【发布时间】:2019-06-14 09:48:23
【问题描述】:

我想将值添加到一个变量中,用逗号分隔,使用 for 循环。 第一个值应保持在前,依此类推。

for ((i=0; i<${#MYARRAY[@]}; i++));
do
  ALL=$ALL$MYARRAY$i,
done
echo $ALL

我期望输出 val1,val2,val3 但实际输出是 val1,val2,val3,

如何避免最后一个值后面的逗号?

【问题讨论】:

  • 欢迎来到 Stackoverflow。您可以为第一次迭代添加条件:if first => add without comma, else => add with comma before the value.
  • 您的字符串连接包含包含数组值的明显尝试,但数组引用的形式不正确。此外,您应该使用小写或混合大小写的变量,以避免它们与 shell 和环境变量之间可能的名称冲突。此外,您可以使用+=。这是所有的组合:all+=${myarray[$i]},,你应该总是引用你的变量:echo "$all"

标签: linux bash shell


【解决方案1】:

只需在 for 循环之后添加三个语句之一:

  1. ALL=${ALL%,}

  2. ALL=${ALL::-1}

  3. ALL=${ALL%?}

【讨论】:

    【解决方案2】:

    https://www.tldp.org/LDP/abs/html/string-manipulation.html 是一个很好的来源。在循环之后插入以下行。

    ALL=${ALL%,}
    

    【讨论】:

    • Thae LDP/abs 通常质量较低。
    【解决方案3】:

    在此示例中,第一次迭代没有在 $ALL 中放置逗号。在接下来的迭代中,在值之前放置一个逗号。这样,输出字符串的末尾就不会有逗号了。

    MYARRAY=(val val val)
    for (( i=0; i<${#MYARRAY[@]}; i++ ))
    do
        if [ $i == 0 ]
        then
            ALL=$ALL$MYARRAY$i
        else
            ALL=$ALL,$MYARRAY$i
        fi
    done
    echo $ALL
    

    【讨论】:

      【解决方案4】:

      这正是[*] 构造的用途:

      myarray=(val1 val2 val3 val4)
      
      oldIFS="$IFS"
      
      IFS=',' 
      echo "${myarray[*]}"
      
      IFS="$oldIFS"
      

      给予:

      val1,val2,val3,val4
      

      我使用小写的myarray,因为大写应该保留给系统(bash)变量。

      注意"${myarray[*]}" 必须在双引号内,否则你不会得到连接魔法。元素由IFS 的第一个字符连接,默认为空格。

      【讨论】:

        【解决方案5】:

        另一个选项是使用 translate (tr) 命令。例如:

        $ myarray=(val1 val2 val3 val4)
        
        $ echo ${myarray[*]}
        val1 val2 val3 val4
        
        $ myarray=$(echo ${myarray[*]} | tr ' ' ,)     # Replace space with ','
        
        $ echo $myarray                                # Gives what you need
        val1,val2,val3,val4
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-26
          • 2019-08-03
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          • 1970-01-01
          • 2018-06-17
          • 1970-01-01
          相关资源
          最近更新 更多