Procura por uma string / padrão no texto selecionado no BASH

2

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 eu o executo no terminal depois de selecionar um texto, ele diz

line 3: [grep: command not found

Eu sou novo no bash scripting. Qualquer ajuda seria apreciada.
Obrigado

    
por bright 27.08.2012 / 08:47

3 respostas

4

Confusamente, [ é na verdade um programa, também é conhecido como teste (1) . Você não precisa colocar seu comando grep em [ . 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ê quer é mais provável assim.

if grep -q -e "-----BEGIN PGP MESSAGE-----" pgp.txt; then
   ...
   ...
fi
    
por 27.08.2012 / 09:04
2

Deve haver um espaço depois de [. 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
    
por 27.08.2012 / 09:07
1

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

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

ATUALIZAÇÃO:

Inserir um espaço depois que 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 erro line 3: [: too many arguments .

Lembre-se de que [ é um comando. Leva argumentos e procedimentos um código de saída.

Você também pode descartar a saída padrão do grep usando:

if grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt >/dev/null
then
    
por 27.08.2012 / 09:06