以下是我在Windows上的cygwin下运行的bash脚本的一个片段:
deployDir=/cygdrive/c/Temp/deploy
timestamp=`date +%Y-%m-%d_%H:%M:%S`
deployDir=${deployDir}/$timestamp
if [ ! -d "$deployDir" ]; then
echo "making dir $deployDir"
mkdir -p $deployDir
fi
这会产生如下输出:
making dir /cygdrive/c/Temp/deploy/2010-04-30_11:47:58
mkdir: missing operand
Try `mkdir --help' for more information.
但是,如果我在命令行上键入/cygdrive/c/Temp/deploy/2010-04-30_11:47:58
它成功,为什么同一命令在脚本中不起作用?
谢谢, 唐
答案 0 :(得分:29)
变化:
mkdir -p $deploydir
到
mkdir -p "$deployDir"
与大多数Unix shell(甚至可能全部都是这样)一样,Bourne(Again)Shell(sh / bash)区分大小写。除了deployDir
命令之外,dir var被称为mkdir
(混合大小写),其中它被称为deploydir
(全小写)。由于deploydir
(全部小写)是deployDir
(混合大小写)的一个被认为是不同的变量,而deplydir
(全部小写)从未为其分配过值,因此{{1} 1}}(全部小写)是空字符串(“”)。
如果没有引号(deploydir
),该行实际上变为mkdir $deploydir
(只是没有所需操作数的命令),因此错误mkdir
。
使用引号(mkdir: missing operand
),该行实际上变为mkdir "$deploydir"
(用于创建具有空字符串的非法目录名称的目录的命令),因此错误mkdir ""
'。
如果目标目录名称包含空格,建议使用带引号(mkdir: cannot create directory
)的表单。
答案 1 :(得分:9)
变化:
mkdir -p $deploydir
到
mkdir -p "$deploydir"
答案 2 :(得分:1)
由于显而易见的原因,您不能在Windows上使用文件名中的冒号。