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]}"

관련 정보