BASH 如果没有双引号变量,脚本 mv 命令将无法运行。为什么?
BASH script mv command would not work without double-quoting variables. Why?
今天写了一个脚本如下:
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 找出变量需要用双引号引起来,但我仍然不明白为什么这样做可以解决问题?
谢谢!
在 shell 中引用可防止 string-splitting 和 glob 扩展。如果你不 double-quote 你的变量,你不知道在这些解析步骤 运行.
之后每个变量可能扩展成多少个参数
即:
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
的文件重命名为 world
:$bar
就这样消失了。
今天写了一个脚本如下:
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 找出变量需要用双引号引起来,但我仍然不明白为什么这样做可以解决问题?
谢谢!
在 shell 中引用可防止 string-splitting 和 glob 扩展。如果你不 double-quote 你的变量,你不知道在这些解析步骤 运行.
之后每个变量可能扩展成多少个参数即:
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
的文件重命名为 world
:$bar
就这样消失了。