경로 이름 확장을 사용하여 변수에 파일 이름 할당

경로 이름 확장을 사용하여 변수에 파일 이름 할당

경로 이름 확장을 활용하여 파일 이름을 변수에 할당하는 안정적인 방법이 있습니까?

이것은 작동하지만 약간 이상해 보입니다.

the_file="$(echo ~/downloads/stack-*-linux-x86_64-static.tar.gz)"

파일이 존재하면 전체 경로가 할당되고 $the_file, 그렇지 않으면 가짜 glob 패턴이 발생합니다.

답변1

와일드카드는 목록 컨텍스트에서만 발생하므로 다음에 할당해야 합니다.대량으로바꾸다. , , 또는 :ksh93​​bashzshmkshyash

the_files=(~/downloads/stack-*-linux-x86_64-static.tar.gz)

또는 sh:

set -- ~/downloads/stack-*-linux-x86_64-static.tar.gz

할당 $1, $2...

그리고 첫 번째 요소를 가져옵니다: "${the_files[1]}"in zshor yash(또는 $the_files[1]in zsh) 또는 "${the_files[0]}"in kshor bash.

모든 요소에 대해: ( "${the_files[@]}"에도 $the_files있음 zsh).

$IFS: "${the_files[*]}"(또한 ) "$the_files"의 첫 번째 문자로 연결된 요소를 결합하는 데 사용됩니다 zsh. 또는 zsh:의 문자열과 연결됩니다 ${(j:, :)the_files}(여기서는 와 연결됨 ,).

주의하실 점이 있습니다

스칼라 변수에 할당

the_file=~/downloads/stack-*-linux-x86_64-static.tar.gz

~확장 되겠지만아니요세계적인. 그러나 다음과 같이 변수를 확장할 때 따옴표를 사용하는 것을 잊어버린 경우:

printf '%s\n' $the_file # instead of printf '%s\n' "$the_file"

그런 다음 $the_file콘텐츠를 분할하고 글로벌로 확장합니다.그 순간이렇게 하면 작동한다고 생각할 수도 있지만 실제로는 그렇지 않으며 물결표 확장과 결합하면 훨씬 더 혼란스러울 수 있습니다.

예를 들어, $HOMEis /All * Users/me$IFSis가 기본값으로 설정된 경우 현재 디렉터리의 모든 파일 이름(확장자 ) 이 $the_file포함되어 인쇄되고 /All * Users/me/downloads/stack-*-linux-x86_64-static.tar.gz그 뒤에 가 붙습니다 .printf/All*Users/me/downloads/stack-*-linux-x86_64-static.tar.gz

패턴이 어떤 파일과도 일치하지 않는 경우 수행할 작업

에서는 zsh오류가 발생하지만 다른 셸에서는 패턴이 동일하게 유지됩니다. 가장 좋은 시나리오는 패턴이 전혀 확장되지 않는다는 것입니다.

zsh즉, Nglob 한정자를 사용 합니다.

the_files=(~/downloads/stack-*-linux-x86_64-static.tar.gz(N))

ksh93glob 연산자 와 ~(N)유사한 기능을 가지고 있습니다 :

the_files=(~/downloads/~(N)stack-*-linux-x86_64-static.tar.gz)

shopt -s nullglob다른 쉘의 경우 일부 전역 옵션( in bash, set -o nullglobin ) 을 활성화해야 합니다 yash.

관련 정보