Bash

使用單個命令的輸出初始化多個 bash 變數

  • March 23, 2021

我的目標是從一個命令的輸出中初始化多個 bash 變數。具體來說, linei應該是 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=''
  1. 如何解決這個問題呢?
  2. 如何將其推廣到其他分隔符,例如 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 字元時終止一行。

引用自:https://unix.stackexchange.com/questions/640638