我有一个 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"
正如您所看到的,第二个和第三个参数之间的所有区别都已丢失。