여러 개의 여러 줄 문자열을 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]}"