공백을 통해 bash 인수 전파

공백을 통해 bash 인수 전파

my-script에서 "$1"은 공백으로 구분된 토큰 문자열입니다.

예를 들어, 이 단일 매개변수를 여러 매개변수로 "확장"하여 다른 프로그램에 전달하려면 어떻게 해야 합니까?

./my-script2 ...$1  # spread the string into multiple arguments, delineating by whitepace

질문을 이해하고 답변을 찾는 데 어려움을 겪고 계시기를 바랍니다.

나는 이것을 시도했습니다 :

./my-script2 <<< "$1"

이:

./my-script2 "" <<< $1

그리고 다른 조합도 있지만 이것은 작동하지 않는 것 같습니다. Bash v3 이상을 지원해야 합니다.

답변1

./my-script2 $1

인용없이매개변수받다분사언제확장하다:

쉘은 단어 분할을 위해 큰따옴표 안에 표시되지 않는 인수 확장, 명령 대체 및 산술 확장의 결과를 스캔합니다.

이것은지정된 POSIX 동작, 일부 쉘(특히 zsh)에서는 기본적으로 이를 비활성화합니다. 기본값을 변경하는 경우 IFS이는 귀하의 책임입니다.

답변2

요약: "파일 이름 확장자" 보안 솔루션(my-script2용):

IFS=' ' read -a arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo

따옴표가 없는 변수를 사용하여 IFS 값을 기준으로 단어로 나누는 간단한 솔루션도 *, ? 그리고 [(적어도).

이 특정 문자열은 잘 작동합니다.

$ set "a string with spaces"
$ printf '<%s>--' $1; echo
<a>--<string>--<with>--<spaces>--

하지만 이 문자열은 분명히 실패합니다.

$ set "a bad * string with spaces"
$ printf '<%s>--' $1; echo
<a>--<bad>--<file1>--<file2>--<string>--<with>--<spaces>--

별표는 PWD의 파일로 확장되었습니다.

여기 문서

"경로 이름 확장"(종종 간과되지만 매우 유용함) 없이 변수 확장을 얻는 한 가지 방법은 여기 문서를 사용하는 것입니다.

IFS=' ' read -ra arr <<-_EOF_
 $1
 _EOF_
 printf '<%s>--' "${arr[@]}" ; echo;

설명서에 설명된 대로:

단어를 인용하지 않으면 문서의 모든 줄에 매개변수 확장, 명령 대체 및 산술 확장이 적용됩니다.

"경로 이름 확장자"는 다음과 같습니다.아니요애플리케이션.

heredoc의 가까운 친척은 herestring이므로 코드가 더 짧아집니다.

IFS=' ' read -ra arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo;

(큰따옴표 안의) 문자 \, $ 및 `는 특수 문자임을 기억하세요.
매뉴얼에서:

문자 시퀀스 \는 무시되며 \는 \, $ 및 ` 문자를 인용하는 데 사용해야 합니다.

관련 정보