Вопрос по unary-operator, bash, if-statement – встретить «ожидается унарный оператор» в скрипте bash

12

в моем bash-скрипте у меня есть функция, которая возвращает 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
}

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

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

Вы должны поместить свое регулярное выражение в переменную.pattern='^ ...some regexp... $'; if [[ $1 =~ $pattern ]], Обратите внимание, что внутри двойных квадратных скобок нет необходимости заключать в кавычки переменные, и, как сказал Гленн, регулярное выражение (переменная) никогда не должно заключаться в кавычки. Dennis Williamson
Обратите внимание, что, по крайней мере, в bash версии 4 вы не должны заключать в кавычки регулярное выражение: это вызывает простое сопоставление строк -documented here, Кроме того, вы должны использоватьfor arg in "[email protected]" с кавычками или прощеfor arg; do ... glenn jackman

Ваш Ответ

1   ответ
29

[ является частьюif синтаксис команды. Это не; синтаксисif это просто

if command; then
    ... things which should happen if command's result code was 0
else
    ... things which should happen otherwise
fi

Один из общихcommandмы используем[ который является псевдонимом для командыtest, Это простая команда для сравнения строк, чисел и файлов. Он принимает довольно узкую комбинацию аргументов и имеет тенденцию генерировать вводящие в заблуждение и вводящие в заблуждение сообщения об ошибках, если вы не передадите ему ожидаемые аргументы. (Или, скорее, сообщения об ошибках являются адекватными и полезными, как только вы к этому привыкнете, но их легко неправильно понять, если вы не используете их.)

В вашемmain функция, вызов[ кажется неуместным. & # xA0; Вы, вероятно, имеете в виду

if function "$arg"; then
    ...
elif ... ; then ...

Кстати, для хорошей меры, вы также должны всегда указывать свои строки. использование"$1" не$1, а также"$arg" вместо$arg.

Исторические причиныtest В качестве общей кухонной утвари авторы не хотели делать часть синтаксисаif является одним из менее привлекательных конструкций оригинальной оболочки Bourne. Баш иzsh предложить альтернативы, которые являются менее громоздкими (например,[[ двойные скобки в Bash, которые вы используете в своемfunction1 определение) и, конечно же, POSIXtest гораздо более вспыльчив, чем оригинальное творение Bell Labs.

В качестве дополнительного пояснения, ваша функция может быть упрощена до

function1 () {
    ! [[ "$1" =~ "^ ...some regexp... $" ]]
}

То есть выполнить тест с[[ и обратный код результата. (Случай "нормальный" будет возвращать 0 для успеха, но, возможно, вы пытаетесь проверить, что строка не соответствует?)

те ... представляют скрипт после $ {1}, и в моем собственном скрипте я аккуратно разделил свой скрипт и скобки одним пробелом. так что я не думаю, что это проблема с этим GJ.
Ой, извините, пропустил ошибку вmain, Спасибо за подсказку. Базовый анализ все еще держится;[ это не то, что вы думаете.
Я изменил этот ответ вstackoverflow.com/a/36371520/874188 это более сфокусированный вопрос. Если вы были связаны здесь, возможно, нажмите на новый вопрос.
нет, моя функция 1 фактически проверяет, соответствует ли этот $ 1 некоторому регулярному выражению. и моя функция 1 просто отлично работает в одиночестве. так что я думаю, что есть некоторая проблема с условием в моей основной функции GJ.
Спасибо! Я не должен использовать скобки в моих основных условиях. Спасибо! GJ.

Похожие вопросы