这是非常基本的,我想我错过了一些非常明显的东西......
以下序列应解释它:
$ 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
答案 0 :(得分:1)
反斜杠正在工作。这是你的调试打印机错了:
for i in $@ ; do
那需要:
for i in "$@"; do
否则,将参数字符串不加引号插入到for表达式中,然后进行单词拆分。