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;
(큰따옴표 안의) 문자 \, $ 및 `는 특수 문자임을 기억하세요.
매뉴얼에서:
문자 시퀀스 \는 무시되며 \는 \, $ 및 ` 문자를 인용하는 데 사용해야 합니다.