구분 기호를 잃지 않고 공백이 있는 파일 이름을 다른 변수에 할당하는 방법

구분 기호를 잃지 않고 공백이 있는 파일 이름을 다른 변수에 할당하는 방법

다음과 같은 bash 스크립트가 있습니다.

files="${@:2}"
for f in $files; do
  echo $f
done

두 번째 인수부터 마지막 ​​인수까지의 쉘 확장을 가져와서 인쇄합니다. 하지만 공백이 있는 파일에는 작동하지 않습니다. 파일을 인쇄합니다.

test image.jpg

~처럼

test
image.jpg

내가 사용하는 경우:

for f in "${@:2}"; do
  echo $f
done

$files에 할당할 필요가 없습니다. 잘 작동합니다.

나는 또한 참조와 함께 첫 번째 사례를 사용해 보았지만 "$files"작동하지 않았습니다. 모든 파일을 한 줄에 인쇄합니다. for in 루프와 같은 확장을 사용할 때 파일 이름을 다른 변수에 할당하고 계속 작동하게 하려면 어떻게 해야 합니까?

답변1

이를 달성하려면 files변수가 아닌 배열이어야 합니다. 노력하다:

files=("${@:2}")
for f in "${files[@]}"; do
  echo "$f"
done

예:

$ bash script.sh first "test image.jpg" "another test.txt"
test image.jpg
another test.txt

논의하다

원본 코드를 살펴보면 다음 설명을 고려하세요.

files="${@:2}"

이는 첫 번째 인수 이후의 모든 인수를 files단일 미분 문자열로 할당합니다. 다음 스크립트를 통해 이를 확인할 수 있습니다.

$ cat test.sh
files="${@:2}"
declare -p files
$ bash test.sh first "test image.jpg" "another test.txt"
declare -- files="test image.jpg another test.txt"

보시다시피 두 번째 매개변수와 세 번째 매개변수 사이의 모든 구별이 사라집니다.

관련 정보