VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
Run Code Online (Sandbox Code Playgroud)
结果:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
Run Code Online (Sandbox Code Playgroud)
我怎么能告诉readarray
不要添加最后的换行符\n
?最新的$
符号是什么意思?
Ini*_*ian 23
隐式尾随换行符不是由readarray
内置字符添加的,而是由 的 here-string ( <<<
) 添加的bash
,请参阅为什么 bash here-string 添加尾随换行符?. 您可以通过打印没有换行符的字符串来摆脱printf
它,并通过过程替换技术读取它< <()
readarray -td, ARR < <(printf '%s' "$VAR")
declare -p ARR
Run Code Online (Sandbox Code Playgroud)
现在会正确生成
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]="d")
Run Code Online (Sandbox Code Playgroud)
您可以使用 split+glob (当您在列表上下文中不引用扩展时会发生什么)。大多数时候它会妨碍我们,当我们真正需要它时不使用它会很遗憾:
IFS=,
set -o noglob
ARR=($VAR) # split+glob with glob disabled, and split using , as delimiter
Run Code Online (Sandbox Code Playgroud)
这比编写一个临时文件然后readarray
像在readarray <<< "$string"
方法中那样调用它稍微不那么复杂(另请注意,readarray -d
需要一个最新版本的bash
)。
请注意,尽管使用了S
in IFS
(代表separator),它的工作方式与拆分为,并且仅readarray
在 中的工作方式相同。a,,b,
"a"
""
"b"
对于真正的拆分运算符,您可以zsh
改用:
ARR=("${(@s:,:)VAR}")
Run Code Online (Sandbox Code Playgroud)
(@
和双引号保留空元素)。