Назад | Перейти на главную страницу

Поиск строки / шаблона в выделенном тексте в 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). Вам не нужно заключать команду 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

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

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

[ это команда, а не синтаксис. Это эквивалентно 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