我有一段 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,更改后务必恢复其旧值。$(..)
此代码中的语法会为您完成此操作。