파일 이름의 공백은 파일 이름 스크립트를 "중단"합니다.

파일 이름의 공백은 파일 이름 스크립트를 "중단"합니다.

Terdon의 예제 3은 다음에서 유래합니다.https://unix.stackexchange.com/a/612718/182280:

  1. .sh이름이 또는로 끝나는 파일을 제외한 모든 파일을 선택하십시오 ..jkl

    $ shopt -s extglob nullglob
    $ files=(!(*.sh|*.jkl))
    $ echo "${files[@]}"
    file.abc file.ABC file.def file.ghi
    
    

문제는 파일의 공백으로 인해 스크립트가 실패한다는 것입니다.

for f in ${files[*]}  #https://unix.stackexchange.com/q/278502/182280
do
 echo "Processing $f file... "
done

예를 들어 fi le1.jkl파일의 공백은 스크립트가 처리될 때 파일을 "중단"하고 다음을 반환합니다.

 processing `fi` file...
 processing `le1.jkl` file...

공백이 파일 이름을 "중단"하지 않도록 하는 방법은 무엇입니까?

배경/질문을 명확히 하는 데 도움이 되는 의견을 보내주셔서 감사합니다.

답변1

바라보다논평루프의 출처는 다음과 같습니다. "${files[@]}"대신 사용해야 합니다 ${files[*]}. 이렇게 하면 배열의 각 항목이 올바르게 참조되고 전체적으로 처리됩니다 for.

for f in "${files[@]}"
do
 echo "Processing $f file... "
done

바라보다배열에 대한 Bash 매뉴얼 섹션세부:

참조 배열의 모든 요소를 ​​사용할 수 있습니다. 쉘의 파일 이름 확장 연산자와의 충돌을 방지하려면 중괄호가 필요합니다. 만약에${name[subscript]}아래 첨자' @' 또는 ' *'인 경우 단어는 배열 이름의 모든 구성원으로 확장됩니다. 이러한 아래첨자는 단어가 큰따옴표 안에 나타날 때만 다릅니다. 단어가 큰따옴표로 묶인 경우 ${name[*]}단일 단어로 확장되고 각 배열 구성원의 값은 변수의 첫 번째 문자로 구분되며 IFSname ${name[@]}의 각 요소는 별도의 단어로 확장됩니다.

당신은 또한 볼 수 있습니다$*와 $@의 차이점은 무엇인가요?

관련 정보