Поиск строки/шаблона в выделенном тексте в BASH

Поиск строки/шаблона в выделенном тексте в BASH

Я хочу расшифровать выделенный текст, если в выделенном тексте встречается строка "-----BEGIN PGP MESSAGE-----". У меня есть следующий код, но он ничего не показывает.

#!/bin/bash
xsel > pgp.txt
if [grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt]
then
gnome-terminal --command "gpg -d -o decrypted.txt pgp.txt"
gedit decrypted.txt
fi

Когда я запускаю его на терминале после выбора текста, он говорит:

line 3: [grep: command not found

Я новичок в bash-скриптинге. Буду признателен за любую помощь.
Спасибо

решение1

Как ни странно, [на самом деле это программа, она также известна кактест (1). Вам не нужно заключать команду grep в [. Если вы собираетесь использовать [для чего-то, вам нужно отделить левую скобку пробелом[ foo == bar ]

Синтаксис if следующий:help if

if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

The `if COMMANDS' list is executed.  If its exit status is zero, then the
`then COMMANDS' list is executed. 

Нужная вам команда, скорее всего, похожа на эту.

if grep -q -e "-----BEGIN PGP MESSAGE-----" pgp.txt; then
   ...
   ...
fi

решение2

После [ должен быть пробел. И grep возвращает строки, так что ваш тест может не сработать. Лучше проверьте статус выхода grep.

grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
exitcode=$?
if [ $exitcode ]
then
   # not found
else
   # found 
fi

решение3

[это команда, а не синтаксис. Это эквивалент команды test.

Уберите квадратные скобки, чтобы проверить, работает ли это:

#!/bin/bash
xsel > pgp.txt
if grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
then
    gnome-terminal --command "gpg -d -o decrypted.txt pgp.txt"
    gedit decrypted.txt
fi

ОБНОВЛЯТЬ:

Вставка пробела после левой скобки также не сработает в вашем случае:

if [ grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt ]
then

потому что bash раскрывает его как:

if test grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
then

и вы получите line 3: [: too many argumentsошибку.

Помните, что [это команда. Она принимает аргументы и процедуры с кодом выхода.

Вы также можете отменить стандартный вывод, grepиспользуя:

if grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt >/dev/null
then

Связанный контент