이 Bash 스크립트를 호출할 때 파일 매개변수에 따옴표가 필요한 이유는 무엇입니까?

이 Bash 스크립트를 호출할 때 파일 매개변수에 따옴표가 필요한 이유는 무엇입니까?

저는 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원하는 대로 스크립트가 확장됩니다.

관련 정보