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シェル(おそらくそれらすべて)と同様に、Bourne(Again)Shell(sh / bash)では大文字と小文字が区別されます。dir varは、呼び出されるコマンド(すべて小文字)deployDirを除いて、どこでも呼び出されます(大文字と小文字が混在)。(すべて小文字)は(混合大文字)とは異なる変数と見なされ、(すべて小文字)には値が割り当てられていないため、(すべて小文字)の値は空の文字列( "")です。mkdirdeploydirdeploydirdeployDirdeplydirdeploydir

引用符(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 に答える