【问题标题】:Appending a character to every element except the last one of a bash array将一个字符附加到除了 bash 数组的最后一个元素之外的每个元素
【发布时间】:2016-12-24 21:34:56
【问题描述】:

我希望将 bash 数组的每个元素附加到 |,最后一个除外。

array=("element1" "element2" "element3")

我想要的输出是

array=("element1"|"element2"|"element3")

我做了什么

for i in ${!array[@]}; 
do
array1+=( "${array[$i]}|" )
done

紧随其后

array=echo ${array1[@]}|sed 's/|$//'

我可以使用任何其他循环方法,只将字符附加到最后一个元素吗?

【问题讨论】:

  • array=("element1"|"element2"|"element3") 只是一个元素而不是 3 个,你想要吗?
  • @anubhava,是的,只要一个元素就可以了。

标签: arrays bash loops


【解决方案1】:

对于您的特殊情况,必须在每个数组成员之间插入一个字符,最简单的解决方案可能是使用数组扩展(并更改分隔字符IFS根据你的需要预先):

$ array=("element1" "element2" "element3")
$ array=( $( IFS="|" ; echo "${array[*]}") )
$ echo "\$array[0] is '${array[0]}'"
$array[0] is 'element1|element2|element3'

【讨论】:

  • 这将问题简化为this one,但 OP 似乎想要一个具有单个元素的数组——不过,使用array=($( IFS="|" ; echo "${array[*]}")) 很容易做到这一点。命令替换巧妙地将IFS 更改为子shell,所以+1 :)
  • 是的,感谢您指出这一点。我没有看到创建单成员数组的意义,但这当然是所要求的。我相应地更新了我的回复,所以输出数据类型是“数组”:)
【解决方案2】:

你可以使用:

# append | all except last element
read -ra array < <( printf "%s|" "${array[@]:0:$((${#array[@]} - 1))}"; echo "${array[@]: -1}"; )

# Check array content now
declare -p array
declare -a array='([0]="element1|element2|element3")'
  • "${array[@]:0:$((${#array[@]} - 1))}" 将获取数组中除最后一个元素之外的所有元素
  • "${array[@]: -1}" 将获取数组的最后一个元素
  • printf "%s|" 将在所有参数前面附加 |
  • &lt; &lt;(...) 是从标准输入读取任何命令输出的进程替换
  • read -ra 将读取数组中的输入

【讨论】:

  • 非常感谢@anubhava。正是我想做的事
【解决方案3】:
$ array=("element1" "element2" "element3")
$ printf -v str "|%s" "${array[@]}"
$ array=("${str:1}")
$ declare -p array
declare -a array='([0]="element1|element2|element3")'

printf 语句创建一个包含|element1|element2|element3 的字符串str,即比我们想要的多一个|(在开始时)。

下一条语句使用子字符串参数扩展 ${str:1} 跳过第一个字符并重新分配给 array,它现在由单个元素组成。

【讨论】:

    【解决方案4】:

    一个简单的解决方案(如果您不介意更改 IFS)是:

    $ array=("element1" "element2" "element3")
    $ IFS="|"; printf "%s\n" "${array[*]}"
    

    并重新分配给变量数组(不改变 IFS):

    $ array=("$(IFS="|"; printf "%s\n" "${array[*]}")")
    $ printf '%s\n' "${array[@]}"
    element1|element2|element3
    

    另一种解决方案是:

    $ array=($(printf '%s|' "${array[@]}")); array="${array%?}"
    $ printf '%s\n' "${array}"
    

    更复杂的解决方案(脚本)是:

    array=("element1" "element2" "element3")
    
           delimiter='|'
           unset newarr
    for    val in "${array[@]}"
    do     newarr=$newarr${newarr+"$delimiter"}$val
    done
    
    array=("$newarr")
    
    echo "array=($array)"
    

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2021-05-16
      • 1970-01-01
      相关资源
      最近更新 更多