Я использую приведенный ниже сценарий для перемещения на два дня назад, когда сценарий запускается в начале двух дней в году, а также для проверки первого и второго дней каждого месяца и перехода на два дня назад.
if [$month="01"] && [$day="01"];
then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"];
then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [ $day = "01" ];
then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
if [ $day = "02" ];
then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
date="$month/$yes_day/$year"
fulldate="$year$month$yes_day"
fi
fi
fi
fi
Но мой плохой получаю сообщение об ошибке ниже
Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
bash
shell
shell-script
test
whitespace
Kumar1
источник
источник
[
. Кроме того, посмотрите наelif
утверждение; это поможет вам очистить вещи. Кроме того, точки с запятой после операторов if не являются необходимыми, но также не являются неправильными, просто странными.if [ ... ]; then
), так что не так уж необычно.Ответы:
[
не является ни метасимволом, ни оператором управления (даже не зарезервированным словом; то же самое для]
), поэтому ему необходимо пространство вокруг него. В противном случае оболочка «видит» команду[01=01]
вместо команды[
с отдельными параметрами01
,=
,01
, и]
. Каждый оператор и операнд должен быть отдельным аргументом[
команды, поэтому пробел также необходим вокруг операторов.[$month="01"]
шаблон подстановки, соответствующий любому из символов в$month
или"01
. Если это ничего не соответствует, это остается один.Если после закрывающей скобки стоит точка с запятой, перед ней не требуется пробел, потому что точка с запятой всегда является частью отдельного токена.
То же самое касается синтаксиса двойных скобок bash (и ksh, и zsh).
Более одного условия
Есть два способа объединить условия:
в
[
с отдельными
[
командами в сочетании с&&
или||
Группировать с помощью скобок, вероятно, легче внутри
[
.Первого следует избегать, так как он ненадежен (попробуйте, например, с
month='!'
). Проблем со странным переменным содержимым можно избежать, если сначала использовать безопасную строку (если она есть); или используя[[
/]]
вместо[
/]
:источник
[
когда-a
/-o
не используется всегда надежно с POSIX-совместимыми оболочками. Там нет никакого преимущества в использовании-a/-o
более&&/||
. Я определенно препятствовал бы его использованию. Обратите внимание, что[[
это не POSIX.Еще один способ написать это:
источник
case
утверждение. Если у вас есть более одногоelif
, вы, вероятно, должны использоватьcase
.Итак, это ваш ответ:
Таким образом, вы должны поставить «пробел» между квадратной скобкой и переменной / значением.
источник
==
вместо стандартных=
.[
akatest
есть=
.[
если для тестов, это не делает никакого назначения, поэтому нет необходимости устранять неоднозначность. Некоторые[
реализации поддерживают==
как расширение над стандартом, но не все. Оболочки Борна,ash
«s,posh
» s[
s или/bin/[
некоторых систем , например нет.==
было добавленоksh
, я полагаю, для согласованности с тем же оператором в его новой(( ... ))
конструкции (которая имеет оба = и ==, но это не стандарт)