Ответ 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 для успеха, но, возможно, вы пытаетесь проверить, что строка не соответствует?)