저는 Bash 스크립팅을 처음 접했습니다. 보다 고급/유용한 스크립트의 기초로 사용하는 "테스트 스크립트"가 있습니다.
#!/bin/bash
files=$1
for a in $files
do
echo "$a"
done
따옴표 없이 호출하면 디렉터리에서 파일 하나만 선택됩니다.
testscript *.txt
하지만 따옴표를 사용하여 호출하면 잘 작동하고 모든 텍스트 파일을 선택합니다.
testscript '*.txt'
여기서 무슨 일이 일어나고 있는 걸까요?
답변1
프로그램을 호출할 때
testscript *.txt
그럼 당신의껍데기모든 값을 확장하고 계산합니다. 따라서 프로그램을 효과적으로 호출할 수 있습니다.
testscript file1.txt file2.txt file3.txt file4.txt
이제 귀하의 프로그램은 보기만 $1
하고 적용됩니다 file1.txt
.
명령줄에서 인용하면 리터럴 문자열이 에 저장되어 *.txt
스크립트에 전달됩니다 $1
. for
그런 다음 루프가 이를 확장합니다.
일반적으로 다음과 같은 스크립트에서는 and를 사용합니다 "$@"
.$1
이것은 CMD를 사용하여 스크립팅하는 사람들에게 "문제"이며 명령 셸에서는 이 작업을 수행할 수 없습니다.와일드카드(잘 알려져 있음) 항상 리터럴 문자열을 전달합니다.
답변2
따옴표가 없으면 쉘은 *.txt
스크립트를 호출하기 전에 확장 되므로 $1
첫 번째 파일만 확장됩니다. 이 시점에서 모든 txt
파일은 스크립트에 대한 인수입니다(너무 많지 않다고 가정).
따옴표를 사용하면 문자열이 확장되지 않고 스크립트로 전달된 다음 for
원하는 대로 스크립트가 확장됩니다.