Ответ 1
Вы делаете общую ошибку, считая, что [ является частью синтаксиса команды if. Это не; синтаксис if - это просто
if command; then
... things which should happen if command result code was 0
else
... things which should happen otherwise
fi
Один из распространенных command, которые мы используем, это [, который является псевдонимом для команды test. Это простая команда для сравнения строк, чисел и файлов. Он принимает довольно узкую комбинацию аргументов и, как правило, создает путаные и вводящие в заблуждение сообщения об ошибках, если вы не передадите ему ожидаемые аргументы. (Вернее, сообщения об ошибках являются адекватными и полезными, когда вы привыкаете к нему, но их легко понять, если вы не используете.)
В вашей функции main вызов [ отображается неправильно. Вероятно, вы имеете в виду
if function "$arg"; then
...
elif ... ; then ...
Кстати, для хорошей меры вы также должны всегда указывать свои строки. Используйте "$1" not $1 и "$arg" вместо $arg.
Исторические причины test как общей кухонной раковины, которую авторы не хотели делать частью синтаксиса if, являются одним из менее привлекательных дизайнов оригинальной оболочки Bourne. Bash и zsh предлагают альтернативы, которые менее громоздки (например, двойные скобки [[ в bash, которые вы используете в определении function1), и, конечно же, POSIX test намного лучше, чем оригинальное создание из Bell Labs.
В качестве дополнительного пояснения ваша функция может быть упрощена до простого
function1 () {
! [[ "$1" =~ "^ ...some regexp... $" ]]
}
То есть, выполните тест с помощью [[ и измените его код результата. ( "Обычный" случай должен был бы вернуть 0 для успеха, но, возможно, вы пытаетесь проверить, что строка не соответствует?)