Ошибка mkdir в bash script

Ниже представлен фрагмент bash script, который я запускаю под cygwin в Windows:

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 в командной строке, он преуспевает, почему одна и та же команда не работает в script?

Спасибо, Дон

Ответ 1

Изменить:

mkdir -p $deploydir

к

mkdir -p "$deployDir"

Как и большинство оболочек Unix (возможно, даже все из них), Bourne (Again) Shell (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") рекомендуется в случае, если имя целевого каталога включает пробелы.

Ответ 2

Изменить:

mkdir -p $deploydir

к

mkdir -p "$deploydir"

Ответ 3

Вы не можете иметь двоеточие в именах файлов в Windows по понятным причинам.