Bash Shell处理包含空格的参数,你编写了一个可以接受文件名作为参数的脚本,看起来一切正常,但有一次脚本出现了问题,结果发现是因为文件名中带有空格。
解决方案
你得仔细将所有可能包含文件名的命令参数全部加上引号。引用变量时,将其放入双引号中。
讨论
真得多谢谢苹果公司了!为了向用户示好,这家公司的设计师普及了一个概念:在文件名中,空格是有效的字符。因此,用户可以将自己的文件命名为 My Report 和 Our Dept Data,而不是只能用那种又丑又没什么可读性的 MyReport 和 Our_Dept_Data。(还有人能明白这种老派文件名的意思吗?)好吧,接下来就该 shell 难受了,原先空格是基本的单词分隔符,文件名始终是一个单词,可如今未必如此了。
那我们该如何应对呢?
在 shell 脚本中,曾经简单的写作 ls -l $1
的地方,现在最好给参数加上引号,改写成 ls -l "$1"
。否则,如果参数包含空格,那么会被 shell 解析成两个单词,$1 中只会包含部分文件名。我们来看一个运行失败的脚本示例。
$ cat simpls.sh
# 一个简单的shell脚本
ls -l ${1}
$
$ ./simple.sh Oh the Waste
ls: Oh: No such file or directory
$
如果调用脚本时没有将文件名放进引号,那么 bash 会看到 3 个参数并将 $1 替换成第 1 个参数(Oh)。ls 命令运行时只有一个参数 Oh,结果就是无法找到该文件。
接下来,我们在调用脚本时给文件名加上引号。
$ ./simpls.sh "Oh the Waste"
ls: Oh: No such file or directory
ls: the: No such file or directory
ls: Waste: No such file or directory
$
还是不行。bash 得到了一个包含 3 个单词的文件名,并将 ls 命令中的 $1
替换成了该文件名。到目前一切都还好。但是,我们并没有将脚本中的变量引用放入引号,因此 ls 将文件名中的各个单词视为单独的参数(作为单独的文件名)。结果还是无法找到这些文件。
我们将变量引用放进引号。
$ cat quoted.sh
# note the quotes
ls -l "${1}"
$
$ ./quoted.sh "Oh the Waste"
-rw-r--r-- 1 smith users 28470 2007-01-11 19:22 Oh the Waste
$
如果将变量引用写成 "${1}"
,它就会被视为一个单词(单个文件名),这样 ls 就只得到了一个参数(文件名),任务顺利完成。
酷客网相关文章:
评论前必须登录!
注册