如果所选文本中出现字符串“-----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