Suchen Sie in BASH nach einer Zeichenfolge/einem Muster im ausgewählten Text

Suchen Sie in BASH nach einer Zeichenfolge/einem Muster im ausgewählten Text

Ich möchte den ausgewählten Text entschlüsseln, wenn die Zeichenfolge „-----BEGIN PGP MESSAGE-----“ im ausgewählten Text vorkommt. Ich habe den folgenden Code, aber er zeigt nichts an.

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

Wenn ich es auf dem Terminal ausführe, nachdem ich einen Text ausgewählt habe, heißt es

line 3: [grep: command not found

Ich bin neu im Bash-Scripting. Für jede Hilfe wäre ich dankbar.
Danke

Antwort1

Verwirrenderweise [ist es eigentlich ein Programm, es ist auch bekannt alsPrüfung (1). Sie müssen Ihren grep-Befehl nicht in ein einschließen [. Wenn Sie für etwas verwenden möchten, [müssen Sie die linke Klammer mit einem Leerzeichen trennen[ foo == bar ]

Die if-Syntax lautet: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. 

Der gewünschte Befehl sieht wahrscheinlich eher so aus.

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

Antwort2

Nach [ sollte ein Leerzeichen stehen. Und grep gibt Zeichenfolgen zurück, sodass Ihr Test fehlschlagen könnte. Überprüfen Sie besser den Beendigungsstatus von grep.

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

Antwort3

[ist ein Befehl, keine Syntax. Es entspricht dem testBefehl.

Entfernen Sie die eckigen Klammern, um zu sehen, ob es funktioniert:

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

AKTUALISIEREN:

Auch das Einfügen eines Leerzeichens nach der linken Klammer funktioniert in Deinem Fall nicht:

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

weil Bash es wie folgt erweitert:

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

und Sie erhalten den line 3: [: too many argumentsFehler.

Denken Sie daran, dass es [sich um einen Befehl handelt. Er benötigt Argumente und Prozeduren und einen Exit-Code.

Sie können die Standardausgabe auch verwerfen, grepindem Sie Folgendes verwenden:

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

verwandte Informationen