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에 생성됩니다.