Bash 매개변수 확장 작업 순서 이해

Bash 매개변수 확장 작업 순서 이해

Bash 프로그래밍 책에서 비슷한 예를 읽었습니다.

$ cat indirection 
#!/usr/bin/env bash

set -x
num=1
eval "${!num#*:}"
$ 

스크립트를 실행할 때 bash indirection "test:echo blah"스크립트의 마지막 줄은 어떻게 처리되나요? 간접 참조가 먼저 발생한다고 생각 eval "${!num#*:}"하면 eval "${1#*:}"? 그런 다음 하위 문자열은 제거 eval "${1#*:}"되고 eval echo blah? 그렇다면 왜 eval필요한가요? 즉, ${!num#*:}대체하면 eval "${!num#*:}"동일한 결과가 제공됩니까?

답변1

매개변수 확장의 출력은 다음과 같습니다.

$ echo "${1#*:}"
echo blah

네, 그렇습니다. 이 특별한 경우에는 다음과 같습니다.

$ set -- "test:echo blah"
$ eval "${1#*:}"
blah

$ ${1#*:}
blah

동일한 명령을 실행하십시오. 그러나 이것이 항상 사실은 아닙니다.

$ "${1#*:}"
bash: echo blah: command not found

실제로 쉘 메타 문자가 포함된 문자열은 따옴표 없이도 제대로 작동하지 않습니다.

$ set -- "test:echo blah > file"
${1#*:}
blah > file

그러나 리디렉션은 발생하지 않습니다(파일이 생성됩니다).

$ eval "${1#*:}"

file이라는 파일이 PWD에 생성됩니다.

관련 정보