Проблемы с 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?
Любая помощь приветствуется.

12
задан AreusAstarte
15.03.2023 5:40 Количество просмотров материала 2712
Распечатать страницу

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 2023-03-16 13: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 2023-03-16 15:45

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 2023-03-16 18:02

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх