다음과 같은 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"
보시다시피 두 번째 매개변수와 세 번째 매개변수 사이의 모든 구별이 사라집니다.