이 Bash 스크립트를 호출 할 때 파일 인수에 따옴표가 필요한 이유는 무엇입니까? Bash 스크립팅을 처음 접했습니다. “테스트 스크립트”가

Bash 스크립팅을 처음 접했습니다. “테스트 스크립트”가 있는데, 고급 / 유용한 스크립트의 기초로 사용했습니다.

#!/bin/bash
files=$1
for a in $files
do
    echo "$a"
done

따옴표없이 이것을 호출하면 디렉토리에서 하나의 파일을 선택합니다.

testscript *.txt

그러나 따옴표로 호출하면 올바르게 작동하고 모든 텍스트 파일을 선택합니다.

testscript '*.txt'

무슨 일이야?



답변

프로그램을 호출 할 때

testscript *.txt

그런 다음 은 확장을 수행하고 모든 값을 해결합니다. 따라서 효과적으로 프로그램을 호출 할 수 있습니다.

testscript file1.txt file2.txt file3.txt file4.txt

이제 프로그램은보고 $1만 작동합니다 file1.txt.

명령 행에 인용하면 리터럴 문자열 *.txt을 스크립트에 전달하게 됩니다 $1. 귀하의 for루프는 다음을 확장합니다.

일반적으로 이와 같은 스크립트 에서는 사용 "$@"하지 않을 것 $1입니다.

이것은 CMD 스크립팅에서 온 사람들에게 “gotcha”입니다. 명령 쉘은 알려진대로 글 로빙을 수행하지 않고 항상 리터럴 문자열을 전달합니다.


답변

따옴표없이 셸 *.txt은 스크립트를 호출하기 전에 확장 되므로 $1확장 된 첫 번째 파일 만 확장됩니다. 모든 txt파일은 그 시점에서 스크립트에 대한 인수입니다 (너무 많지 않다고 가정).

따옴표를 사용하면 문자열이 스크립트로 확장되지 않고 전달되므로 for원하는대로 확장 할 수 있습니다 .


답변