我有這樣的事情:
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
是一個系統變量,如果它被覆蓋,可能會出現許多令人不快的問題。