在 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 命令括在 中[。如果您要使用[for 某些内容,则需要用空格字符分隔左括号[ 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

相关内容