20

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

谢谢,唐

4

3 回答 3

42

改变:

mkdir -p $deploydir

mkdir -p "$deployDir"

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

没有引号 ( mkdir $deploydir),该行有效地变为mkdir(只是没有所需操作数的命令),因此错误mkdir: missing operand

使用引号 ( mkdir "$deploydir"),该行有效地变为mkdir ""(使用空字符串的非法目录名称创建目录的命令),因此错误mkdir: cannot create directory'.

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

于 2010-04-30T10:28:16.083 回答
10

改变:

mkdir -p $deploydir

mkdir -p "$deploydir"
于 2010-04-30T10:01:27.620 回答
1

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

于 2010-04-30T10:29:51.947 回答