Answers:
隐含的尾随换行符不是由readarray
内建函数添加的,而是由的here-string(<<<
)添加的bash
,请参见为什么bash here-string会添加尾随的换行符?。您可以通过不使用换行符的方式打印字符串来摆脱这种情况,printf
并通过过程替换技术来读取它< <()
readarray -td, ARR < <(printf '%s' "$VAR")
declare -p ARR
现在可以正确生成
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]="d")
您可以使用split + glob(当您在列表上下文中不使用扩展名时会发生的情况)。大多数情况下,它会阻碍我们的发展,当我们真正需要它时不使用它会很可惜:
IFS=,
set -o noglob
ARR=($VAR) # split+glob with glob disabled, and split using , as delimiter
与编写临时文件然后readarray
像在readarray <<< "$string"
方法中一样调用它(要注意,readarray -d
需要使用最新版本的bash
)相比,这样做要容易一些。
需要注意的是,尽管S
在IFS
(代表分隔符),即以同样的方式readarray
在a,,b,
被分裂成"a"
,""
且"b"
只。
对于真正的拆分运算符,您可以使用zsh
:
ARR=("${(@s:,:)VAR}")
(@
和双引号保留空白元素)。
readarray <<< "$string"
写入一个文件tempp,然后删除它,而不是使用的内存?
readarray -d
@StéphaneChazelas的答案的罐头版本:
# usage: setarray varname sep string
setarray(){ declare -n a=$1; local IFS=$2 -; set -f; a=($3); }
$ setarray arr , 1,2,3,
$ declare -p arr
declare -a arr=([0]="1" [1]="2" [2]="3")
$ setarray path : "$PATH"
$ setarray ld_preload ': ' "$LD_PRELOAD" # its elements can be separated by either ':' or spaces
...
该local -
会作出这样的选择set -f
(noglob
)函数的局部,就像变量。
该declare -n a=$1
会创建一个局部变量a
作为别名由名为全局变量$1
(第一个参数的函数)。
"What is the meaning of the latest $ symbol?"