如何将带有空格的文件名分配给另一个变量而不丢失分隔符

如何将带有空格的文件名分配给另一个变量而不丢失分隔符

我有一个 bash 脚本,例如:

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

它获取从第二个参数到最后一个参数的 shell 扩展,并打印它。但是它不适用于带有空格的文件。它打印文件:

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"

正如您所看到的,第二个和第三个参数之间的所有区别都已丢失。

相关内容