2010-04-30 201 views
10

下面是我在Cygwin的Windows上運行bash腳本的一個片段:MKDIR錯誤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它成功,爲什麼相同的命令不能在腳本中工作?

謝謝, 唐

回答

24

變化:

mkdir -p $deploydir 

mkdir -p "$deployDir" 

與大多數Unix shell(甚至所有的shell)一樣,Bourne(Again)Shell(sh/bash)區分大小寫。 dir var除mkdir命令外,在任何地方都被稱爲deployDir(混合大小寫),它被稱爲deploydir(全部小寫)。由於deploydir(全部小寫)是deployDir(混合大小寫)和deplydir(全部小寫)之間的一個被認爲不同的變量,因此從未爲其指定值,因此deploydir(全部小寫)的值爲空字符串(「」)。

沒有引號(mkdir $deploydir),該行有效地變爲mkdir(只是沒有所需操作數的命令),因此錯誤mkdir: missing operand

隨着引號(mkdir "$deploydir"),行有效地成爲mkdir ""(命令,使與空字符串的非法目錄名的目錄),因此錯誤mkdir: cannot create directory」。

如果目標目錄名稱包含空格,建議使用帶引號的表單(mkdir "$deployDir")。

8

變化:

mkdir -p $deploydir 

mkdir -p "$deploydir" 
1

由於顯而易見的原因,Windows上的文件名中不能有冒號。

+0

的確如此。但誰說過關於Windows的一切? – 2010-04-30 13:41:51

+0

@丹尼斯:這個問題? 「[...]在Windows下運行於cygwin」? – unwind 2010-05-02 17:41:06

+0

哎呀,回到我的幼兒園。但是,Cygwin在文件名中支持冒號。 – 2010-05-02 18:21:06