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

関連情報