bash 매개변수 확장은 단순한 텍스트 교체 이상의 것 같습니다.

bash 매개변수 확장은 단순한 텍스트 교체 이상의 것 같습니다.

나는 bash 가 "$<var>"단순히 . 다음 상호 작용을 고려하십시오.$<var><var>

1: $ X="A; B"
2: $ printf "%s\n" $X
3: A;
4: B
5: $ printf "%s\n" "A; B"
6: A; B
7: $ printf "%s\n" A; B
8: A
9: B: command not found

보시다시피, 2행의 출력은 5행의 출력과 다르므로 이 경우의 확장은 $X단순한 텍스트 대체가 아닙니다. 큰따옴표(7행)를 제거해도 아무런 효과가 없습니다.

bash가 이러한 상황을 정확히 어떻게 처리하는지 설명할 수 있나요?

답변1

인용하지 않았기 때문에 $X말로 표현되었을 수도 있습니다. 2행에서 실행된 명령은 다음과 같습니다.

printf '%s\n' 'A;' B

쉘 은 ;이스케이프되지만 공백은 이스케이프되지 않습니다. 이는 7행의 명령과 다릅니다.

$ printf "%s\n" A; B

이스케이프되지 않기 때문에 ;명령 구분 기호 역할을 합니다. 즉, 다음 명령은 B명령이 아닌 이므로 명령을 찾을 수 없다는 오류가 발생합니다.

5행은 큰따옴표로 인해 예상대로 작동하며, 2행에도 큰따옴표가 필요합니다. 단어 분할을 방지합니다. 원하는 명령은 다음과 같습니다.

printf "%s\n" "$X"

관련 정보