Я хочу расшифровать выделенный текст, если в выделенном тексте встречается строка "-----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