web-dev-qa-db-ja.com

bashスクリプトのmkdirエラー

以下は、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コマンドラインで成功しましたが、同じコマンドがスクリプトで機能しないのはなぜですか?

ありがとう、ドン

15
Dónal

変化する:

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")は、ターゲットディレクトリ名にスペースが含まれている場合に推奨されます。

31
Bert F

変化する:

mkdir -p $deploydir

mkdir -p "$deploydir"
9
Paul R

明らかな理由により、Windowsではファイル名にコロンを含めることはできません。

1
unwind