![xrandr| grep "connected" 給了我不只一行,但 IFS=$'\n' read 無法破壞它](https://rvso.com/image/1457840/xrandr%7C%20grep%20%22connected%22%20%E7%B5%A6%E4%BA%86%E6%88%91%E4%B8%8D%E5%8F%AA%E4%B8%80%E8%A1%8C%EF%BC%8C%E4%BD%86%20IFS%3D%24'%5Cn'%20read%20%E7%84%A1%E6%B3%95%E7%A0%B4%E5%A3%9E%E5%AE%83.png)
我有這樣的事情:
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
是一個系統變量,如果它被覆蓋,可能會出現許多令人不快的問題。