1

这是非常基本的,我想我错过了一些非常明显的东西......

下面的顺序应该解释它:

$ cat read_file_names.sh 
#!/bin/bash
for i in $@ ; do 
    echo "$i"
done
$ touch "filename has many spaces" 
$ ./read_file_names.sh filename\ has\ many\ spaces 
filename
has
many
spaces

理想情况下,命令行将在文件名周围加上引号,如下所示:

$ ./read_file_names.sh "filename\ has\ many\ spaces"

问题是当允许 bash 自动完成文件名时(通过点击选项卡),文件名没有被引用。相反,它有一个反斜杠空格“\”来表示空格。我知道我可以手动添加引号,但这会很乏味并且用户体验很差。

我正在寻找一种将整个文件名分配给 for-loop 变量的解决方案,以便输出看起来像这样:

$ ./read_file_names.sh filename\ has\ many\ spaces 
filename has many spaces
4

1 回答 1

1

反斜杠正在工作。错误的是您的调试打印机:

for i in $@ ; do

那需要是:

for i in "$@"; do

否则,参数字符串不加引号地插入到 for 表达式中,然后进行分词。

于 2013-09-28T04:26:03.777 回答