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
阵列的复制..
回答:
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")'
回答:
你在新行分割字符串的方法是正确的:
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"
以上是 BASH阵列副本 的全部内容, 来源链接: utcz.com/qa/262337.html