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
원하는대로 확장 할 수 있습니다 .