xrandr| grep "connected" 給了我不只一行,但 IFS=$'\n' read 無法破壞它

xrandr| grep "connected" 給了我不只一行,但 IFS=$'\n' read 無法破壞它

我有這樣的事情:

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

相關內容