我的目标是从一个命令的输出中初始化多个 bash 变量。具体来说, linei
应该是变量 的值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=''
- 如何解决这个问题呢?
- 如何将其推广到其他分隔符,例如空字节
\0
?
答案1
如果你有一个空行,则使用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 字符时终止一行。