Procure uma string/padrão no texto selecionado no BASH

Procure uma string/padrão no texto selecionado no BASH

Desejo descriptografar o texto selecionado se a string "-----BEGIN PGP MESSAGE-----" ocorrer no texto selecionado. Eu tenho o seguinte código, mas não aparece nada.

#!/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

Quando executo no terminal depois de selecionar um texto, ele diz

line 3: [grep: command not found

Eu sou novo em scripts bash. Qualquer ajuda seria apreciada.
Obrigado

Responder1

Confusamente, [é na verdade um programa, também é conhecido comoteste (1). Você não precisa colocar seu comando grep em um arquivo [. Se você fosse usar [para algo, você precisa separar o colchete esquerdo com um caractere de espaço[ foo == bar ]

A sintaxe 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. 

O comando que você deseja é provavelmente mais parecido com este.

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

Responder2

Deve haver um espaço após [. E grep retorna strings para que seu teste possa falhar. É melhor você verificar o status de saída do grep.

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

Responder3

[é um comando, não uma sintaxe. É equivalente ao testcomando.

Remova os colchetes para ver se funciona:

#!/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

ATUALIZAR:

Inserir um espaço após o colchete esquerdo também não funciona no seu caso:

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

porque o bash o expande como:

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

e você receberá o line 3: [: too many argumentserro.

Lembre-se de que isso [é um comando. São necessários argumentos e procedimentos e um código de saída.

Você também pode descartar a saída padrão grepusando:

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

informação relacionada