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?"