BASH阵列副本

问题描述:

我是BASH新手。BASH阵列副本

我有字符串名称数组,但我需要一套数组作为数组,而这个数组作为数组必须包括阵列由\n(新线)分割的字符串,字符串的部分

这是我有:

ARRAY=$'one\ntwo'; 
x=$ARRAY; 
IFS=$'\n' read -rd '' -a y <<<"$x"; 
y=(${x//$'\n'/}); 
IFS=$'\n' y=(${x//$'\n'/ }); 
IFS=$'\n' y=($x); 
unset ARRAY; (i try unset ARRAY) 
ARRAY=$y; (this not works correctrly) 
echo ${ARRAY[1]}; //result ARRAY[0]="one",ARRAY[1]="" 

但如果我尝试echo ${y[1]}; //一切都是正确的Y [0] = “一个” Y [1] = “两节”

我的问题是,我不能设置数组作为y阵列的复制..

+0

请将您想要的结果添加到您的问题。 – Cyrus

+0

ARRAY [0] =“one” ARRAY [1] =“two” –

ARRAY=$'one one one\ntwo' 
OLD_IFS="$IFS" 
IFS=$'\n' ARRAY=($ARRAY) 
IFS="$OLD_IFS" 
declare -p ARRAY 

输出:

 
declare -a ARRAY='([0]="one one one" [1]="two")' 
+0

请注意,您正在全局设置IFS,而不仅仅是数组赋值的持续时间。 – chepner

+0

@chepner:谢谢。我已经更新了我的答案。 – Cyrus

+0

请注意,由于路径名称扩展,这会中断。 –

你在新行分割字符串的方法是正确的

array=$'one\ntwo' 
IFS=$'\n' read -rd '' -a y <<<"$array" 

现在,你为什么给一个不同的名称,如果最终你想要变量array包含数组?只是这样做:

IFS=$'\n' read -rd '' -a array <<<"$array" 

如果array在这里出现两次都没有问题。现在


,如果你想副本一个数组,你会做到这一点(假设数组复制被称为y在你的例子):

array=("${y[@]}") 

注意,这不会保留数组的稀疏性(但在你的情况下,y不稀疏,所以这没有问题)。


另一评论:当你做IFS=$'\n' read -rd '' -a y <<<"$array"read将与1返回代码返回;虽然这不是一个问题,你可能仍然希望通过使return开心:

IFS=$'\n' read -rd '' -a array < <(printf '%s\0' "$array") 

最后一个评论:而不是使用read你可以使用内置mapfile(仅bash≥4.0):

mapfile -t array <<< "$array"