Сценарий Bash для обнаружения пустой строки сообщения. Получение: Слишком много аргументов

Большая часть программного обеспечения Linux является бесплатным. Распространяя исходный код с некоторыми инструкциями по компиляции, а не с двоичными файлами, у вас есть возможность просмотреть или даже отредактировать исходный код перед его компиляцией. Таким образом, вы можете быть уверены в том, что программа действительно делает и что она не вредна.

1
14.02.2019, 00:36
1 ответ

Вы получаете сообщение об ошибке "слишком много аргументов", так как [... ]не понимает оператор =~(, используемый в bashдля сопоставления с регулярным выражением ). Поскольку [... ]не понимает оператора, он рассматривается как строка. Затем у вас есть [... ]с тремя строками внутри, и они не удовлетворяют семантическим требованиям для правильного теста, поэтому bashошибки на этом этапе.

В bashвы должны использовать =~внутри [[... ]].

Однако я предполагаю, что в этом тесте вы хотели бы увидеть, содержит ли $message$checkwordв качестве подстроки. Это также можно сделать с помощью

[[ "$message" == *"$checkword"* ]] && sendY

или с помощьюcase... esac:

case $message in
    *"$checkword"*) sendY
esac

Таким образом, вам не нужно беспокоиться о $checkwordсодержании символов, которые могут быть специальными в регулярных выражениях.

Вам также необходимо двойные кавычки $messageв echo $message,или вы можете получить неожиданный вывод, если $messageсодержит подстановочные символы имени файла, такие как *.

Связанные:


Вы также можете использовать это вместо первой операции в скрипте:

case $message in
    *[!\ ]*) # contains non-space
        message='``` '"$message"' ```' ;;
    *)       # contains nothing or only spaces
        message=
esac

Использование case... esacв обоих местах сделало бы ваш скрипт (по крайней мере тех битов, которые вы показали ), переносимыми на любуюsh-подобную оболочку.

4
27.01.2020, 23:18

Теги

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