選択したテキストに文字列「-----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