没有双引号变量,BASH脚本mv命令将无法工作。为什么?

时间:2016-01-21 23:35:02

标签: bash variables double-quotes

我今天写了一个脚本如下:

echo "Enter a directory path"

read dir

for file in $dir/[!.]*;
    do
        f=`echo $file | sed 's/ /_/g'`
        mv "${file}" "${f}"  
    done

最初,mv命令写成:

mv ${file} ${f}

但那条线正在投掷

usage: mv [-f | -i | -n] [-v] source target
   mv [-f | -i | -n] [-v] source ... directory

我能够使用google来确定变量需要用双引号括起来,但我仍然不明白为什么这样做会解决问题?
谢谢!

1 个答案:

答案 0 :(得分:3)

在shell中引用,可以防止字符串拆分和glob扩展。如果你不对引号进行双引号,那么在运行这些解析步骤之后,你不知道每个变量可以扩展到多少个参数。

那是:

mv $foo $bar

......可能变成......

mv ./first word second word third word destination-file

如果

foo='./first word second word third word'
bar='destination-file'

同样,考虑你有一个包含glob表达式的文件名的情况:

foo='hello * world'

在这种情况下,您的mv命令将获得当前目录中所有文件的列表

...或者,考虑参数为空的情况:

foo='hello world'
bar=''

在这种情况下,您将尝试将名为hello的文件重命名为{{1},而不是(正确地)获取您无法使用0字节名称的文件的错误。 }:world只是消失了。