Встречается "ожидаемый унарный оператор" в bash script

в моем bash script, у меня есть функция для возврата 0 или 1 (true или false) для более позднего основного условия функции.

function1 () { 
    if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then
        return 1
    else
        return 0
    fi 
}

то в моей основной функции:

main () { 
    for arg in ${@} ; do
        if [ function1 ${arg} ] ; then
            ...
        elif [ ... ] ; then
            ...
        fi
    done
}

однако, когда я запускал этот script, он всегда выдавал мне сообщение об ошибке msg "[: function1: ожидаемый унарный оператор"

может кто-нибудь мне помочь?

Ответы

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