2017-01-05 1 views
-2

У меня есть небольшой Баш скрипт:Bash == не найден

#!/bin/bash 
if [[ "[email protected]" == "pull" ]] 
then 
    # stuff 
elif [[ "[email protected]" == "push" ]] 
then 
    # stuff 
else 
    echo "Command not recognised" 
fi 

он находится в/USR/бен/локальный, и я сделал его исполняемым. Однако всякий раз, когда я запускаю его, я получаю script:1: == not found

Любые идеи?

Это macOS, если это имеет значение.

+0

в строке: zsh: 'bad pattern: [[' –

+0

Исправьте опечатку в исходном вопросе (без пробела перед вторым '=='), добавьте, к каким аргументам вы вызываете его. Вы называете это с bash или zsh? – leekaiinthesky

+0

Я называю это глобальным скриптом, так как он находится в/usr/local/bin. ZSH - это мое приглашение, однако первая строка скрипта '#!/Bin/bash' должна установить env для bash, когда скрипт выполняется? –

ответ

2
  1. Не используйте [[, не определенные POSIX. Вместо того, чтобы использовать [

  2. Dont использовать ==, используйте =

  3. Не используйте [email protected], используйте $1

  4. Dont использовать двойные кавычки в этой ситуации для pull и push, по сути не использовать их вообще

  5. Не используйте Bash, если sh будет делать

Обновленный сценарий:

#!/bin/sh 
if [ "$1" = pull ] 
then 
    # stuff 
elif [ "$1" = push ] 
then 
# stuff 
else 
    echo 'Command not recognised' 
fi 
+3

Вы не знаете, если '# stuff' не использует функции bash. – melpomene

+0

Идеально подходит для работы. Хотел бы я знать, почему Баш не работал? –

+4

Не удалось ли все это сделать как «случай» $ 1 «в тяну) ... ;; От себя) ...;; *) ... ;; esac'? – melpomene

0

Вставлять с Баш в качестве переводчика, ваша единственная проблема с использованием "[email protected]", что в тестах, как в Bash [[ и POSIX-х [ и test, расширяется ко всем аргументам, окруженными цитаты (как и "$*"). Вероятно, вы хотите, чтобы "$1" проверял только первый аргумент.

Вы можете также рассмотреть возможность использования case (переключатель) заявление:

#!/bin/bash 
case "$1" in 
    (pull) echo "you said pull" ;; 
    (push) echo "you said push" ;; 
    ( * ) echo "Command '$1' is not recognised" ;; 
esac 

(приведенный выше код будет работать в Баш, ш и ЗШ я предполагаю, что вы по-прежнему требуют Баш в связи с другими аспектами вашего кода. .)

+0

Вы смогли воспроизвести или объяснить вывод '== not found' отчетов OP? –

+1

@CharlesDuffy - Нет, я не могу воспроизвести это с помощью Bash 4.4.5, Bash 4.0.42, ksh 93u + или zsh 5.3. Конечно, Даш и друзья будут жаловаться на базизмы. Я также смущен возможностью репортера выполнить программу с учетом недействительного shebang, то есть я понятия не имею, какая оболочка фактически используется. csh и tcsh сначала будут жаловаться на недопустимое имя переменной (также [не использовать их] (http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/)! –

+0

Где он говорит, что 'bash' установлен неправильно? * Script * находится в '/ usr/local/bin', но нет ничего плохого в shebang. – chepner