使用分隔符时,如何删除readarray添加的新行?


Answers:


13

隐含的尾随换行符不是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")

3
哇!我永远都找不到。谢谢
user1156544

4

您可以使用split + glob(当您在列表上下文中不使用扩展名时会发生的情况)。大多数情况下,它会阻碍我们的发展,当我们真正需要它时不使用它会很可惜:

IFS=,
set -o noglob

ARR=($VAR) # split+glob with glob disabled, and split using , as delimiter

与编写临时文件然后readarray像在readarray <<< "$string"方法中一样调用它(要注意,readarray -d需要使用最新版本的bash)相比,这样做要容易一些。

需要注意的是,尽管SIFS(代表分隔符),即以同样的方式readarraya,,b,被分裂成"a""""b"只。

对于真正的拆分运算符,您可以使用zsh

ARR=("${(@s:,:)VAR}")

@和双引号保留空白元素)。


readarray <<< "$string"写入一个文件tempp,然后删除它,而不是使用的内存?
user1156544

@ user1156544是。
mosvy

我如何做与您在bash中的最后一个命令相似的操作?我正在使用bash 3.3并尝试弥补不足的情况readarray -d
user1156544

3

@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 -fnoglob)函数的局部,就像变量。

declare -n a=$1会创建一个局部变量a作为别名由名为全局变量$1(第一个参数的函数)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.