Я использую сервер 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

В то время как в bash 3.2.51 он распознает выражение и работает под bash 4 в Ubuntu, он выдает странную ошибку:

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

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

3 ответа3

4

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

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

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

Редактировать :

Чтобы запустить скрипт:

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

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

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

2

Вы вообще не используете Bourne Again Shell.

Ошибочно полагать, что /bin/sh - это нечто большее, чем POSIX-совместимая оболочка. (Даже если бы это было Баш, когда Баш вызывается как sh оно тонко меняет свое поведение.) В Ubuntu /bin/sh теперь по умолчанию использует оболочку Debian Almquist, которая представляет собой другую оболочку - одну из множества оболочек (Томпсон, Борн, Bourne Again, Almquist, Korn, Z, Friendly Interactive, C, Tenex C, BusyBox, Обычный, совместимый с политикой,…), который можно найти в системах Unix и Linux. Переключение /bin/sh с Bourne Again на Debian Almquist улучшило скорость загрузки систем Debian и Ubuntu, которые выполняют множество сценариев оболочки как часть процесса загрузки.

Если вы действительно хотите использовать в своем скрипте такие bashisms, как (()) , то явно укажите /bin/bash в качестве интерпретатора сценария в его #! линия.

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

дальнейшее чтение

0

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

#!/bin/sh

read n

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .