bash脚本中的mkdir错误

时间:2010-04-30 09:58:17

标签: bash shell mkdir

以下是我在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它成功,为什么同一命令在脚本中不起作用?

谢谢, 唐

3 个答案:

答案 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上使用文件名中的冒号。