在 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

相關內容