경로 이름 확장을 활용하여 파일 이름을 변수에 할당하는 안정적인 방법이 있습니까?
이것은 작동하지만 약간 이상해 보입니다.
the_file="$(echo ~/downloads/stack-*-linux-x86_64-static.tar.gz)"
파일이 존재하면 전체 경로가 할당되고 $the_file
, 그렇지 않으면 가짜 glob 패턴이 발생합니다.
답변1
와일드카드는 목록 컨텍스트에서만 발생하므로 다음에 할당해야 합니다.대량으로바꾸다. , , 또는 :ksh93
bash
zsh
mksh
yash
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 zsh
or yash
(또는 $the_files[1]
in zsh
) 또는 "${the_files[0]}"
in ksh
or 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
콘텐츠를 분할하고 글로벌로 확장합니다.그 순간이렇게 하면 작동한다고 생각할 수도 있지만 실제로는 그렇지 않으며 물결표 확장과 결합하면 훨씬 더 혼란스러울 수 있습니다.
예를 들어, $HOME
is /All * Users/me
및 $IFS
is가 기본값으로 설정된 경우 현재 디렉터리의 모든 파일 이름(확장자 ) 이 $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
즉, N
glob 한정자를 사용 합니다.
the_files=(~/downloads/stack-*-linux-x86_64-static.tar.gz(N))
ksh93
glob 연산자 와 ~(N)
유사한 기능을 가지고 있습니다 :
the_files=(~/downloads/~(N)stack-*-linux-x86_64-static.tar.gz)
shopt -s nullglob
다른 쉘의 경우 일부 전역 옵션( in bash
, set -o nullglob
in ) 을 활성화해야 합니다 yash
.