서브쉘을 사용하여 공백이 포함된 매개변수 전달

서브쉘을 사용하여 공백이 포함된 매개변수 전달

"name_value.sh"라는 셸이 있고 하위 셸에서 생성된 인수를 전달하고 싶습니다. 서브셸에서 인수를 받는 명령이 공백을 보존하는지 어떻게 확인할 수 있나요?

참고: 이것은 제가 하고 있는 작업에 대한 매우 간단한 예입니다. 답변하기 전에 전체 내용을 읽어보시기 바랍니다.

단순화된 예는 다음과 같습니다.

./name_value.sh $(echo "no_spaces"; echo "with spaces")

name_value.sh는 다음과 같습니다.

#!/bin/bash
echo "Name=$1"
echo "Value=$2"

원하는 출력은 다음과 같습니다.

Name=no_spaces
Value=with spaces

이는 매우 단순화된 예입니다. 내 실제 하위 쉘은 복잡하며 동시에 생성되어 name_value.sh에 전달되어야 하는 수십 개의 이름/값 쌍을 반복하고 출력합니다. 나는 또한 내가 호출하는 쉘 파일을 제어할 수 없습니다.

나는 따옴표로 에코하고 printf와 "%q"를 사용해 보았습니다. 또한 서브셸의 결과를 먼저 배열에 넣는 것을 고려했지만 그 중 하나도 작동하지 못했습니다. 하위 쉘 대신 텍스트를 입력하는 것처럼 하위 쉘을 해석하려면 상위 쉘이 필요합니다.

답변1

예. 변수(일반적으로 공백, 탭, 개행 문자 포함)를 IFS개행 문자로 설정합니다. 이렇게 하면 단어 분할에 공백과 탭이 사용되지 않습니다. 그러면 원하는 출력이 제공됩니다.

IFS=$'\n'
set -o noglob # disable the second effect of leaving that
              # $(...) unquoted.
./name_value.sh $(echo "no_spaces"; echo "with spaces")

그러나 내가 원하는 것은 표준 입력에서 스크립트를 읽는 것입니다.

# name_value.sh
IFS= read -r name
IFS= read -r value
echo "Name=$name"
echo "Value=$value"

그 다음에

( echo no_spaces; echo with spaces ) | ./name_value.sh

나는 이 접근 방식이 더 강력하다고 생각합니다.

답변2

이 명령을 사용할 때

./name_value.sh $(echo "no_spaces"; echo "with spaces")

bash는 "$()"에서 "sub-shells" 명령을 실행하고 다음을 반환합니다.출력 문자열

다음 명령을 입력하세요:./name_value.sh $(echo "no_spaces"; echo "공백 포함")

처리된 명령:./name_value.sh 공백이 있는 no_spaces

다음 단계는 세 개의 매개변수를 사용하여 bash 스크립트를 실행하는 것입니다.

첫 번째 인수:공간 없음

두 번째 인수:그리고

세 번째 주장:공간


이는 명령을 사용하여 스크립트를 수동으로 호출하는 것과 같습니다.

./name_value.sh no_spaces with spaces

문제를 해결하려면 서브쉘 호출 "$()" 주위에 따옴표를 삽입해야 합니다.

너한테 이게 필요해

./name_value.sh $(echo "no_spaces") "$(echo "with spaces")"

처리 중인 명령은 다음과 같습니다.

./name_value.sh no_spaces "with spaces"

마지막으로 출력은 다음과 같습니다.

Name=no_spaces
Value=with spaces

관련 정보