【问题标题】:How to change values of bash array elements without loop如何在没有循环的情况下更改bash数组元素的值
【发布时间】:2012-09-26 11:29:26
【问题描述】:
array=(a b c d)

我想在数组的每个元素之前添加一个字符以便拥有这个

array=(^a ^b ^c ^d)

一种简单的方法是循环数组元素并逐个更改值

for i in "${#array[@]}"
do
    array[i]="^"array[i]
done

但我想知道是否有任何方法可以在不循环数组的情况下做同样的事情,因为我必须对所有元素执行相同的指令。

提前致谢。

【问题讨论】:

    标签: arrays bash


    【解决方案1】:

    使用参数扩展:

    array=("${array[@]/#/^}")
    

    来自文档:

    ${参数/模式/字符串}

    模式替换。该模式被扩展以产生一个模式,就像在路径名中一样 扩张。参数被扩展并且模式与其值的最长匹配是 替换为字符串。如果 pattern 以 / 开头,则所有匹配的 pattern 都替换为 细绳。通常只替换第一场比赛。如果模式以 # 开头,则必须 匹配参数扩展值的开头。如果模式以 % 开头,它 必须在参数扩展值的末尾匹配。如果字符串为空,则匹配 模式被删除, / 后面的模式可以省略。如果参数是@或*, 替换操作依次应用于每个位置参数,扩展是结果列表。如果 parameter 是以 @ 或 * 为下标的数组变量,则 对数组的每个成员依次进行替换操作,展开为 结果列表。

    【讨论】:

    • 我还有一个问题。我想知道我是否可以使用它来更改数组的一个子集,因为当我运行这个数组[@]:i:10=(${array[@]:i:10}/ 时出现语法错误#/^})
    • @tuxworker 我认为您需要先将子范围数组分配给另一个数组变量,然后添加前缀。
    • 注意:如果您有 IFS=$'\n' (处理带有空格的名称),则该命令将不会保留原始数组结构。它只会使数组仅包含一项(字符串列表),其中包含所有更改的字符串。之后运行:declare -p array
    【解决方案2】:

    这种方式也尊重数组值中的空格:

    array=( "${array[@]/#/^}" )
    

    注意,如果数组为空并且您之前设置过,这将失败

    set -u
    

    我不知道如何使用短代码来消除这个问题...

    【讨论】:

    • 可能是 array=("${array[@]:+${array[@]/#/^}}"),但我无法通过 bash-4.4.0bash-4.1.5 重现它(空数组 + set -u)。不过,在后者中,您需要此构造来迭代带有 for 的数组。
    • 如何标记字符串的开始和结束?来自:declare -a arr=(12 123); echo "${arr[@]/12/00}"我想要00 123,但我得到00 003
    猜你喜欢
    • 2022-01-12
    • 2023-03-25
    • 2015-02-24
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多