私の目標は、1つのコマンド出力で複数のbash変数を初期化することです。特に、lineはi
変数の値でなければなりません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
?
答え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文字を読み取ると行を終了します。