我有类似的东西:
declare -a DISPLAYS
AUXILIAR="$(xrandr | grep " connected ")"
IFS=$'\n' read -ra DISPLAYS <<< "$AUXILIAR"
为什么它没有检测到换行符
echo "$AUXILIAR"
打印多行?
更新
本作品旨在:
AUXILIAR="$(xrandr | grep " connected " | tr '\n' '%')"
IFS='%' read -ra DISPLAYS <<< $(echo $AUXILIAR)
我还是想知道为什么它没有分裂成断线。
答案1
默认情况下,read
仅会读取一次一行。例如,我们在这里提供三输入行,如您所见,read
仅读取第一行:
$ IFS=$'\n' read -ra displays <<< $'a\nb\nc\n'; declare -p displays
declare -a displays='([0]="a")'
可以使用该-d
选项来改变此行为。例如:
$ IFS=$'\n' read -d '' -ra displays <<< $'a\nb\nc\n'; declare -p displays
declare -a displays='([0]="a" [1]="b" [2]="c")
这里-d ''
使用了。这告诉read
它一直读取直到找到 NUL 字符。由于 bash 字符串中永远不可能有 NUL 字符,因此这会导致它读取我们用此处字符串提供的所有输入。
使用 %
$ IFS=% read -ra displays <<< 'a%b%c'; declare -p displays
declare -a displays='([0]="a" [1]="b" [2]="c")'
使用%
有效,因为read
会继续读取 之后的%
内容。默认情况下,它只会在遇到换行符时停止。
其他
为变量使用小写或混合大小写名称被认为是最佳做法。系统使用大写名称,您不想意外覆盖其中一个。例如,DISPLAY
是一个系统变量,如果被覆盖,可能会发生许多令人不快的问题。