从字符串数组中创建一个字符串

从字符串数组中创建一个字符串

我有一段 bash 代码,我想从字符串数组中创建一个长字符串。

bash代码如下:

# Load all the SNPs
arrSNPsToBeExtracted=( $( cat $indexFileName ) )

arrSNPsString="\""

lenArrSNPsToBeExtracted=${#arrSNPsToBeExtracted[*]} 
si=0
while [ $si -lt $lenArrSNPsToBeExtracted ]
do
    arrSNPsString=${arrSNPsString}"|"${arrSNPsToBeExtracted[$si]}

    #echo $si": "${arrSNPsString}

    let si++
done

arrSNPsString=$arrSNPsString"\""

echo $arrSNPsString

=====================

如您所见,我有一个 SNP(单词)列表:

word1
word2
word3

我想让它变成这样:

"word1|word2|word3"

此字符串已分配给arrSNPsString,但我无法实现它。我做错了什么?

正如您在代码中看到的,arrSNPsString应该变得更长,但是相反,它在 while 循环结束时仅取最后一项。

我知道这与本地和全局环境/变量有关。我想arrSNPsString在本地循环中扩展全局字符串。

有人知道我该如何解决这个问题吗?

答案1

我在 bash 中读到了这个手册页

如果单词被双引号引起来,则 ${name[*]}扩展为一个单词,其中每个数组成员的值由 IFS 特殊变量的第一个字符分隔。

因此你可以用以下方法替换你的循环:

arrSNPsString="$(IFS="|"; echo "${arrSNPsToBeExtracted[*]}" )"
echo "$arrSNPsString"

我直接在 bash 提示符下尝试了这个:

a[1]=aaaa
a[2]="bbbb cccc"
a[3]=dddd
b="$(IFS="|"; echo "${a[*]}")"
echo "$b"

打印结果为:

aaaa|bbbb cccc|dddd

不要弄乱 IFS,更改后务必恢复其旧值。$(..)此代码中的语法会为您完成此操作。

相关内容