다음 스크립트 1 을 고려하십시오 .
#!/bin/bash
bash <<END
printf "%s\n" "$@"
END
놀랍게도 (나에게는) $@
여기서 문서 내부가 먼저 확장된 다음 인용되므로 출력은 다음과 같습니다.
$ /tmp/test.sh "a a" b c
a a b c
따옴표를 제거하면 간단한 $@
동작이 발생합니다.
$ /tmp/test.sh "a a" b c
a
a
b
c
두 옵션 모두 원하는 출력을 제공하지 않습니다. 비슷한 배열을 사용해 보았지만 args=("$@")
확장은 같은 방식으로 작동합니다. "결과"를 다음과 같은 변수에 넣으려고 했지만 args="$@"
이것은 "aab c"만 반환합니다.
출력을 아래와 같이 만드는 방법에 대한 아이디어가 있습니까?
a a
b
c
1분명히 이것은 매우 간단합니다. 실제로 저는 heredoc을 사용하여 스크립트를 실행하고 있지만 docker run
이 질문에서는 중요하지 않습니다.
답변1
안에여기 문서, 쉘은 "달러 대체"( $foo
, $(some command)
, 및 백슬래시 로 보호됨) `some command`
를 수행합니다 . 여기 문서는 큰따옴표로 묶인 문자열처럼 확장됩니다. 이를 방지하려면 여기에서 문서의 닫는 태그에 따옴표를 사용하십시오. 그러면 문서는 작은 따옴표로 묶인 문자열처럼 동작합니다(전혀 확장되지 않음).$((x+1))
\`$
bash <<'END'
printf "%s\n" "$@"
END
"$@"
이는 내부 bash에 의해 확장되고 어떠한 인수도 수신하지 않기 때문에 원하는 작업을 수행하지 않습니다 . 실제 사용 사례에서 작동할 수도 있고 작동하지 않을 수도 있는 가장 간단한 직접적인 솔루션은 매개변수를 내부적으로 bash로 전달하는 것입니다.
bash /dev/stdin "$@" <<'END'
printf "%s\n" "$@"
END
실제 사용 사례에서 내부적으로 bash에 인수를 전달할 수 없는 경우 환경 변수를 통해 전달할 수 있습니다. 하지만 환경 변수당 하나의 문자열만 전달할 수 있으므로 전달해야 할 문자열의 개수가 가변적인 경우에는 편리하지 않습니다.
export widget_count="$1" data_source="$2" frobnicator="$3"
…
bash <<'END'
printf "%s\n" "$widget_count" "$data_source" "$frobnicator"
END
최후의 수단으로 이러한 값을 참조로 전달해야 할 수도 있습니다. 쉘 구문을 인용하는 문자열:
'
로 교체하세요'\''
.'
시작과 끝 부분에 추가되었습니다'
.
답변2
문제는 원하는 출력을 얻는 방법이므로 이것이 귀하의 목적에 적합할 것이라고 믿습니다.
함수 내에서 원하는 인쇄 문을 다음과 같이 선언해 보았습니다.
function test_function {
printf "%s\n" "$@"
}
그런 다음 원하는 입력으로 bash에서 실행하십시오.
bash-3.2$ function test_function {
> printf "%s\n" "$@"
> }
bash-3.2$ cat << EOF
> $(test_function "a a" b c)
> EOF
a a
b
c