Запуск его как ./script.sh
заставит ядро прочитать первую строку (шебанг), а затем вызовет bash для интерпретации сценария. Запуск его под sh script.sh
использует любую оболочку, по умолчанию установленную в вашей системе sh
(в Ubuntu это Dash, которая совместима с sh, но не поддерживает некоторые дополнительные функции Bash).
Вы можете исправить это, вызвав его как bash script.sh
, или, если это ваша машина, вы можете изменить /bin/sh
на bash, а не на то, чем оно является в настоящее время (обычно просто с помощью ссылки - rm /bin/sh && ln -s /bin/bash /bin/sh
). Или вы можете просто использовать ./script.sh
вместо этого, если это уже работает;)
Если ваша оболочка действительно dash и вы хотите изменить сценарий для обеспечения совместимости, https://wiki.ubuntu.com/DashAsBinSh содержит полезное руководство по различиям. В вашем примере это выглядит так, как будто вам просто нужно удалить ключевое слово function.