Это не очень хорошая идея для использования! в имени функции, если вы хотите, чтобы ваш код был переносимым. bash --posix или вызов bash как «sh», оба отклоняют «hello!» как имя функции. Но я подозреваю, что bash молча разрешает аберрантные имена функций («hello?», «Hello-» и «hello /» также работают, если назвать несколько), потому что одним из важных применений функций является возможность пользователю переопределять обычные команды и эти команды ( например, ls, rm и т. д.) может содержать любые символы, разрешенные файловой системой.
Обратите внимание, что "привет!" как переменная имя не работает.