если, элиф, другие операторы проблемы в Bash

Я не могу понять, что проблема со следующим выражением if относится к elif и then. Имейте в виду, что printf все еще находится в разработке. Я просто не смог его проверить в заявлении, поэтому более чем вероятно неверно.

Ошибка, которую я получаю:

./timezone_string.sh: line 14: syntax error near unexpected token `then'
./timezone_string.sh: line 14: `then'

И это утверждение выглядит так.

if [ "$seconds" -eq 0 ];then
   $timezone_string="Z"
elif[ "$seconds" -gt 0 ]
then
   $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
else
   echo "Unknown parameter"
fi

Ответ 1

Между elif и [ отсутствует пробел:

elif[ "$seconds" -gt 0 ]

должно быть

elif [ "$seconds" -gt 0 ]

Поскольку я вижу, что этот вопрос получает много просмотров, важно указать, что следующий синтаксис:

if [ conditions ]
# ^ ^          ^

это означает, что необходимо указывать в скобках. Иначе это не сработает. Это потому, что [ сам по себе является командой.

Причина, по которой вы не видите что-то вроде elif[: command not found (или аналогичного), заключается в том, что после просмотра if и then оболочка ищет elif, else или fi. Однако он находит другой then (после неправильно отформатированного elif[). Только после анализа оператора он будет выполнен (и будет выведено сообщение об ошибке, подобное elif[: command not found).

Ответ 2

У вас есть некоторые проблемы с синтаксисом в вашем скрипте. Вот исправленная версия:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

Ответ 3

[ - это команда (или встроенная в некоторые оболочки). Он должен быть отделен пробелом от предыдущего оператора:

elif [

Ответ 4

Я бы порекомендовал вам взглянуть на основы кондиционирования в Bash.

Символ "[" является командой и должен иметь пробел перед ней. Если вы не ставите пробел после своего elif, система интерпретирует elif [ как особую команду, которая определенно не является тем, что вы хотели бы в данный момент.

Использование:

elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]

Короче говоря, отредактируйте свой сегмент кода, чтобы:

elif [ "$seconds" -gt 0 ]

Вы бы хорошо без ошибок компиляции. Ваш окончательный сегмент кода должен выглядеть следующим образом:

#!/bin/sh    
if [ "$seconds" -eq 0 ];then
       $timezone_string="Z"
    elif [ "$seconds" -gt 0 ]
    then
       $timezone_string='printf "%02d:%02d" $seconds/3600 ($seconds/60)%60'
    else
       echo "Unknown parameter"
    fi