bash脚本中的mkdir错误

22

以下是我在 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 ,它会成功执行,为什么同样的命令在脚本中无法工作?

谢谢, Don

3个回答

44

变更:

mkdir -p $deploydir

mkdir -p "$deployDir"

就像大多数Unix shell一样(甚至可能是所有的),Bourne(Again)Shell(sh/bash)是大小写敏感的。dir变量在所有地方都叫做deployDir(混合大小写),除了mkdir命令,在那里它被称为deploydir(全部小写)。由于deploydir(全部小写)被认为是一个不同于deployDir(混合大小写)的变量,且deplydir(全部小写)从未被分配过值,因此deploydir(全部小写)的值为空字符串(“”)。

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

使用引号形式(mkdir "$deployDir")是建议的,在目标目录名包含空格的情况下。


我遇到了这个问题,解决方法非常简单。记得在变量“=”和赋值变量值之间不要留空格。 - Ken Ingram

10

修改:

mkdir -p $deploydir

to

mkdir -p "$deploydir"

1
在Windows上,文件名中不能有冒号,这是显而易见的。

这是正确的。但谁说了关于Windows的事情? - Dennis Williamson
@Dennis:问题是?“[...]在Windows上通过cygwin运行”? - unwind
哎呀,我得回到幼儿园了。不过,Cygwin确实支持文件名中的冒号。 - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接