VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
结果:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
我怎么能告诉readarray
不要添加最后的换行符\n
?最新的$
符号是什么意思?
VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
结果:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
我怎么能告诉readarray
不要添加最后的换行符\n
?最新的$
符号是什么意思?
隐式尾随换行符不是由
readarray
内置函数添加的,而是由 的 here-string (<<<
) 添加的bash
,请参阅Why does a bash here-string add a trailing newline char? . 您可以通过打印没有换行符的字符串来摆脱printf
它,并通过流程替换技术读取它< <()
现在会正确生成
您可以使用 split+glob (当您在列表上下文中未引用扩展时会发生什么)。大多数时候它都会妨碍我们,当我们真正需要它时不使用它会很可惜:
这比编写一个临时文件然后
readarray
像在readarray <<< "$string"
方法中那样调用它要简单一些(还请注意,readarray -d
需要一个最新版本的bash
.请注意,尽管有
S
inIFS
(代表separator),但它的工作方式与readarray
in thata,,b,
is split into的方式相同"a"
,""
并且"b"
仅。对于真正的拆分运算符,您可以
zsh
改用:(
@
和双引号保留空元素)。@StéphaneChazelas 回答的罐头版本:
这
local -
将使set -f
(noglob
) 之类的选项成为函数的局部变量,就像变量一样。将
declare -n a=$1
创建一个局部变量a
作为由$1
(函数的第一个参数)命名的全局变量的别名。