Bash
使用單個命令的輸出初始化多個 bash 變數
我的目標是從一個命令的輸出中初始化多個 bash 變數。具體來說, line
i
應該是 variable 的值i
。例子:我的命令是一個 Python 程序,名稱為
init.py
:if __name__ == '__main__': print("Value of A") print("Value of B") print() print("Value of D")
期望的結果:
echo "A='$A', B='$B', C='$C', D='$D'" # --> A='Value of A', B='Value of B', C='', D='Value of D'
然後我嘗試但沒有成功:
read A B C D < <(python init.py) # --> Effect: A='Value', B='of', C='A', D='' read -d$'\n' A B C D < <(python init.py) # --> Effect: A='Value', B='of', C='A', D='' IFS=$'\n' read A B C D < <(python init.py) # --> Effect: A='Value of A', B='', C='', D='' IFS=$'\n' read -d$'\n' A B C D < <(python init.py) # --> Effect: A='Value of A', B='', C='', D=''
- 如何解決這個問題呢?
- 如何將其推廣到其他分隔符,例如 Null 字節
\0
?
如果你有一個空行,使用
IFS
將不起作用,因為多個\n
被擠壓。但是,您可以使用
readarray
:readarray -t arr < <(python init.py) echo "A='${arr[0]}', B='${arr[1]}', C='${arr[2]}', D='${arr[3]}'"
添加
-d ''
以分隔\0
:readarray -d '' -t arr < <(python init.py)
來自
man bash
:-d delim 的第一個字元用於終止每個輸入行,而不是換行符。如果 delim 是空字元串,mapfile 將在讀取 NUL 字元時終止一行。