![如何将带有空格的文件名分配给另一个变量而不丢失分隔符](https://linux22.com/image/74895/%E5%A6%82%E4%BD%95%E5%B0%86%E5%B8%A6%E6%9C%89%E7%A9%BA%E6%A0%BC%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E5%88%86%E9%85%8D%E7%BB%99%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%8F%98%E9%87%8F%E8%80%8C%E4%B8%8D%E4%B8%A2%E5%A4%B1%E5%88%86%E9%9A%94%E7%AC%A6.png)
我有一个 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"
正如您所看到的,第二个和第三个参数之间的所有区别都已丢失。