使用单个命令的输出初始化多个 bash 变量

使用单个命令的输出初始化多个 bash 变量

我的目标是从一个命令的输出中初始化多个 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=''
  1. 如何解决这个问题呢?
  2. 如何将其推广到其他分隔符,例如空字节\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 字符时终止一行。

相关内容