以下は、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
コマンドラインで成功しましたが、同じコマンドがスクリプトで機能しないのはなぜですか?
ありがとう、ドン
変化する:
mkdir -p $deploydir
に
mkdir -p "$deployDir"
ほとんどのUnixシェル(おそらくすべてのシェル)と同様に、Bourne(再び)シェル(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"
)は、ターゲットディレクトリ名にスペースが含まれている場合に推奨されます。
変化する:
mkdir -p $deploydir
に
mkdir -p "$deploydir"
明らかな理由により、Windowsではファイル名にコロンを含めることはできません。