【问题标题】:mkdir error in bash scriptbash 脚本中的 mkdir 错误
【发布时间】:2011-02-14 04:19:00
【问题描述】:

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

谢谢, 唐

【问题讨论】:

    标签: bash shell mkdir


    【解决方案1】:

    变化:

    mkdir -p $deploydir
    

    mkdir -p "$deployDir"
    

    与大多数 Unix shell(甚至可能全部)一样,Bourne (Again) Shell (sh/bash) 区分大小写。 dir var 在任何地方都称为deployDir(大小写混合),除了mkdir 命令,它被称为deploydir(全部小写)。由于deploydir(全小写)被认为是与deployDir(混合大小写)不同的变量,并且deplydir(全小写)从未分配过值,deploydir(全小写)的值是空字符串(“”)。

    没有引号 (mkdir $deploydir),该行实际上变成了mkdir(只是没有所需操作数的命令),因此出现错误mkdir: missing operand

    加上引号(mkdir "$deploydir"),该行实际上变成了mkdir ""(用空字符串的非法目录名创建目录的命令),因此错误mkdir: cannot create directory'。

    如果目标目录名称包含空格,建议使用带引号的表单 (mkdir "$deployDir")。

    【讨论】:

    • 我遇到了这个问题,解决起来非常简单。记住不要在变量“=”和分配的变量值之间留空格。
    【解决方案2】:

    出于显而易见的原因,您不能在 Windows 上的文件名中使用冒号。

    【讨论】:

    • 确实如此。但是谁说过 Windows?
    • @Dennis:这个问题? “[...] 在 Windows 上的 cygwin 下运行”?
    • 糟糕,帮我回幼儿园。但是,Cygwin 确实支持文件名中的冒号。
    【解决方案3】:

    变化:

    mkdir -p $deploydir
    

    mkdir -p "$deploydir"
    

    【讨论】: