Terdon의 예제 3은 다음에서 유래합니다.https://unix.stackexchange.com/a/612718/182280:
.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[*]}
단일 단어로 확장되고 각 배열 구성원의 값은 변수의 첫 번째 문자로 구분되며IFS
name${name[@]}
의 각 요소는 별도의 단어로 확장됩니다.
당신은 또한 볼 수 있습니다$*와 $@의 차이점은 무엇인가요?