Похожие вопросы

перенаправление вывода nohup в другой файл
Bash скрипт для редактирования имени файла и перемещения файла.
Mac OS X сохраняет" старую " переменную окружения
как запустить screenfetch как команду?
не удается увеличить переменную внутри цикла в сценарии bash
Linux-Avoid cat: нет такого файла или каталога, когда файл не существует
Переменные не передаются из одного скрипта, вызывающего другой с bash heredoc
Закройте сценарий bash, когда curl получает статус HTTP, отличный от 200
Изменение атрибутов всех целевых символических ссылок в каталоге
чтение команды с таймаутом для нетерминального ввода в bash
команда diskutil не найдена в терминале OS X
Bash-скрипт для резервного копирования и восстановления структуры каталогов
Запуск jpegoptim в cronjob раз в неделю, на CentOS из cPanel, только для файлов, добавленных в течение прошлой недели?
Putty: войдите в систему, выполните команду / измените переменную среды и не закрывайте сеанс
Как изменить цвет конкретного типа файла в оболочке bash в linux?

Проблемы с Bash 4.2.45 на Ubuntu

Я использую сервер remot под управлением Ubuntu 13.10 с установленным Bash 4.2.45. Моя домашняя система-OS X Mavericks с установленным Bash 3.2.51 (сборка Darwin). Я не использовал bash много в прошлом, но я работал над довольно большим сценарием и заметил несколько вещей, которые были странными в версии, установленной на удаленном сервере.

возьмем простой скрипт, например:

#!/bin/sh

read n

if ((n > 10)); then
        echo "Number is pretty big"
else
        echo "NUMBER IS WEAK AND SMALL"
fi

пока под Баш 3.2.51 он признает выражение и работает под Бэш 4 на Ubuntu выдает странную ошибку:

script.sh: 5: script.sh: n: not found

но не только (( . . . )) не распознаются, но иногда переменные и другие логические операторы. Как Новичок bash это очень запутанно, и я хотел спросить, что я могу с этим поделать. Можно ли изменить правила синтаксиса? Или просто понизить удаленный сервер до 3.х.версия y?
Любая помощь приветствуется.

5
задан AreusAstarte
источник

3 ответов

когда я прочитал Ваш запрос, я был удивлен вашим поведением, поэтому я решил воспроизвести его быстро, поэтому я установил новую виртуальную машину Ubuntu 13.10 с версией Bash 4.2.45.

после этого я смог воспроизвести поведение, которое вы описываете.

после дальнейших исследований, кажется, что вы просто должны заменить #!/bin/sh by #!/bin/bash чтобы заставить его работать.

изменить :

запуск сценарий:

  • bash script.sh и ./script.sh будет работать.
  • sh script.sh не будет работать.

если у вас есть #!/bin/bash в первой строке

надеюсь, что это будет работать для вас !

4
отвечен user2196728 2014-01-02 23:14:28
источник

вы вообще не используете оболочку Bourne.

ошибочно полагать, что /bin/sh - Это нечто большее, чем POSIX-совместимая оболочка. (Даже если это были bash, когда bash вызывается как sh он тонко меняет свое поведение.) На Ubuntu, /bin/sh теперь по умолчанию используется оболочка Debian Almquist, которая является разные оболочки - один из многих снарядов (Томпсон, Борн, Борн снова, Альмквист, Корн, Z, дружественный интерактивный, C, Tenex C, BusyBox, Policy-совместимый обычный,...), который можно найти в системах Unix и Linux. Переключатель /bin/sh от Борна снова Debian Almquist улучшена скорость загрузки систем Debian и Ubuntu, которые выполняют много сценариев оболочки в процессе загрузки.

если вы действительно хотите использовать bashisms как ((...)) в вашем скрипте, затем явно set /bin/bash как интерпретатор скрипта в #! линия.

и наоборот, если вы хотите указать /bin/sh как ваш интерпретатор сценариев в таких разнообразных системах, как Mac OS и Linux, придерживайтесь строго только того, что соответствует POSIX.

более дальнеишее чтение

2
отвечен JdeBP 2014-01-02 23:20:08
источник

n - это переменная, поэтому вы должны ссылаться на нее, используя"$":

#!/bin/sh

read n

if (($n > 10)); then
        echo "Number is pretty big"
else
        echo "NUMBER IS WEAK AND SMALL"
fi
0
отвечен Teun Vink 2014-01-02 22:59:47
источник

Другие вопросы bash linux macos ubuntu