stdinを複数行の文字列に分割し、各文字列を異なるbash変数に入れる方法

stdinを複数行の文字列に分割し、各文字列を異なるbash変数に入れる方法

複数の複数行文字列を bash スクリプトにパイプし、そのスクリプトからそれぞれを取得する可能性を探しています。最後に、各複数行の文字列を独自の変数に保存したいと思います。

printf "$some_multiline_string" "$another_multiline_string" | some_script.sh some_params

バッシュ内部:

#!/bin/bash
file1=$(</dev/stdin)
file2=$(</dev/stdin)
...

stdinを複数の複数行変数に分割する方法は?

答え1

なぜ環境を使わないのですか?

export some_multiline_string another_multiline_string

その後、スクリプト内でこれらの変数にアクセスできます。

潜在的に非常に大きく、引数/envvarの最大サイズを超えるか、結合されている場合はarg + envリストの最大サイズを超える場合はパイプできます。

myscript 3< <(printf %s "$some_multiline_string") \
         4< <(printf %s "$another_multiline_string") args

そしてその中でmyscript

IFS= read -rd '' -u3 var1
IFS= read -rd '' -u4 var2
exec 3<&- 4<&-

あるいは、単一のストリーム(スクリプトのstdinなど)からNULで区切って渡すこともできます(bash変数には表示されません)。

printf '%s\0' "$some_multiline_string" "$another_multiline_string" |
  myscript args

そしてその中でmyscript

IFS= read -rd '' var1 && IFS= read -rd '' var2

答え2

あなたの質問を完全に理解することはできませんが、あなたが探しているものは次のとおりです。

script.sh "$some_multiline_string" "$another_multiline_string" param1 param2

これにより、スクリプトには次のものが含まれます。

file1="$1"
file2="$2"
param1="$3"
param2="$4"

実際にパイプが必要な場合は、次のことができます。

printf '%s\0%s' "$str1" "$str2" | script.sh param1 param2

そしてスクリプトから:

#!/bin/bash
param1="$1"
param2="$2"

strings=()
while IFS= read -d '' str; do
    strings+=("$str")
done
printf 'String 1: %s\n\nString 2: %s\n' "${strings[0]}" "${strings[1]}"

たとえば、

$ str1="this is
a multiline
string"

$ str2="this is
another multiline
string"

$ printf '%s\0%s\0' "$str1" "$str2" | foo.sh
String 1: this is
a multiline
string

String 2: this is
another multiline
string

Bash 4.4+バージョンでは、次のことができます。

#!/bin/bash
param1="$1"
param2="$2"

strings=()
readarray -t -d '' strings

printf 'String 1: %s\n\nString 2: %s\n' "${strings[0]}" "${strings[1]}"

関連情報