【问题标题】:Shell: How to append a prefix while looping through an array?Shell:如何在遍历数组时附加前缀?
【发布时间】:2011-08-14 03:32:46
【问题描述】:

我正在尝试遍历一个数组并为数组中的每个值附加一个前缀。简化版代码:

#!/bin/sh
databases=( db1 db2 db3 )
for i in live_${databases[@]} stage_${databases[@]}
do
    ....
done

但是,它只在数组中的第一个值前面加上前缀 - 它循环的值是:

live_db1 db2 db3 stage_db1 db2 db3

有什么想法吗?谢谢。

【问题讨论】:

  • ( "prepend" 表示前缀;"append" 表示后缀是有意义的 ;-) )

标签: arrays bash shell


【解决方案1】:
databases=( db1 db2 db3 )
for i in ${databases[@]/#/live_} ${databases[@]/#/stage_}
do
    ....
done

【讨论】:

    【解决方案2】:

    试试这样的:

    #!/bin/sh
    databases="db1 db2 db3"
    for i in $databases
    do
        x="live_$i"
        y="stage_$i"
        echo "$x $y"
    done
    

    【讨论】:

    • 我希望在for 行中附加前缀。原因是我还有第三个数组要循环,它不带前缀。 (for i in $core live_$dbs stage_$dbs)。不过谢谢 - 也许字符串会是数组的更好替代品。
    • 好吧,我想出了一个解决方案。我通过将live_$i stage_$i 附加到$core 的$databases 添加了一个单独的for 循环,然后将主for 循环修改为仅通过$core。感谢您的帮助。
    【解决方案3】:
    for i in $( for d in ${databases[@]}; do echo "live_$d stage_$d"; done )
    do
        ....
    done
    

    【讨论】:

      【解决方案4】:

      只是添加到 John Kugelman 的答案。详情可见:

      bash 手册页 -> 参数扩展 -> 模式替换

      ... 如果 pattern 以 # 开头,则必须匹配 参数的扩展值。 ...

      【讨论】:

        猜你喜欢
        • 2019-11-23
        • 2014-01-26
        • 1970-01-01
        • 2017-07-28
        • 2012-10-15
        • 2017-04-23
        • 2017-10-23
        • 2016-03-01
        相关资源
        最近更新 更多