正确的bash解析包含反斜杠空格而不是引号的不带引号的文件参数

时间:2013-09-28 04:12:33

标签: bash parsing tabs arguments filenames

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

以下序列应解释它:

$ 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

1 个答案:

答案 0 :(得分:1)

反斜杠正在工作。这是你的调试打印机错了:

for i in $@ ; do

那需要:

for i in "$@"; do

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