数组 – Bash – 将数组分隔为字符串

前端之家收集整理的这篇文章主要介绍了数组 – Bash – 将数组分隔为字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道以下内容

为什么给出的非工作示例不起作用
>如果在工作实例中给出的方法比其他清洁方法更好.

不工作的例子

> ids=(1 2 3 4);echo ${ids[*]// /|}
1 2 3 4
> ids=(1 2 3 4);echo ${${ids[*]}// /|}
-bash: ${${ids[*]}// /|}: bad substitution
> ids=(1 2 3 4);echo ${"${ids[*]}"// /|}
-bash: ${"${ids[*]}"// /|}: bad substitution

工作实例

> ids=(1 2 3 4);id="${ids[@]}";echo ${id// /|}
1|2|3|4
> ids=(1 2 3 4); lst=$( IFS='|'; echo "${ids[*]}" ); echo $lst
1|2|3|4

在上下文中,要在sed命令中使用的分隔字符串进行进一步解析.

# REVISION: 2017-03-14
# Use of read and other bash specific features (bashisms)

因为括号用于分隔数组,而不是字符串:

ids="1 2 3 4";echo ${ids// /|}
1|2|3|4

一些示例:使用两个字符串填充$ids:a b和c d

ids=("a b" "c d")

echo ${ids[*]// /|}
a|b c|d

IFS='|';echo "${ids[*]}";IFS=$' \t\n'
a b|c d

…最后:

IFS='|';echo "${ids[*]// /|}";IFS=$' \t\n'
a|b|c|d

阵列组合在一起,由IFS的第1个字符分隔,而空格替换为|在数组的每个元素中.

当你做:

id="${ids[@]}"

您将字符串构建从将空间的数组ids合并到类型为string的新变量中.

注意:当“${ids [@]}”给出一个空格分隔的字符串时,“${ids [*]}”(带有星号*而不是at符号@)将渲染由第一个字符$IFS.

什么人bash说:

man -Len -Pcol\ -b bash | sed -ne '/^ *IFS /{N;N;p;q}'
   IFS    The  Internal  Field  Separator  that  is used for word splitting
          after expansion and to split  lines  into  words  with  the  read
          builtin command.  The default value is ``<space><tab><newline>''.

玩$IFS:

set | grep ^IFS=
IFS=$' \t\n'
declare -p IFS
declare -- IFS=" 
"
printf "%q\n" "$IFS"
$' \t\n'

字面上一个空格,一个列表和(含义或)一个换行符.所以,第一个字符是一个空格. *的使用将与@一样.

但:

{
# OIFS="$IFS"
    # IFS=$': \t\n'
    # unset array 
    # declare -a array=($(echo root:x:0:0:root:/root:/bin/bash))
IFS=: read -a array < <(echo root:x:0:0:root:/root:/bin/bash)

    echo 1 "${array[@]}"
    echo 2 "${array[*]}"
    OIFS="$IFS" IFS=:
    echo 3 "${array[@]}"
    echo 4 "${array[*]}"
    IFS="$OIFS"
}
1 root x 0 0 root /root /bin/bash
2 root x 0 0 root /root /bin/bash
3 root x 0 0 root /root /bin/bash
4 root:x:0:0:root:/root:/bin/bash

注意:IFS =:read -a数组< <(...)将使用:作为分隔符,而不会永久设置$IFS.这是因为输出行#2显示空格作为分隔符.

猜你在找的Bash相关文章