Я хочу расшифровать выделенный текст, если в выделенном тексте встречается строка «----- 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). Вам не нужно заключать команду 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
После [. И grep возвращает строки, поэтому ваш тест может не пройти. Вам лучше проверить статус выхода grep.
grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
exitcode=$?
if [ $exitcode ]
then
# not found
else
# found
fi
[
это команда, а не синтаксис. Это эквивалентно 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