このスクリプトを実行できないのはなぜですか?

このスクリプトを実行できないのはなぜですか?
$ sh bashtrrrrrr 

# whats my pub. ip?
bashtrrrrrr: line 19: unexpected EOF while looking for matching `''
bashtrrrrrr: line 20: szintaktikai hiba:  váratlan fájl vég


$  cat bashtrrrrrr 
#!/bin/bash

echo '
# what's my pub. ip?
alias myip="curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1"

# shorten ssh connection with tsocks
function t() { read THEIP; tsocks ssh root@$THEIP; }

# red/green terminals regarding exit code
export PROMPT_COMMAND='PS1="`
if [[ \$? = "0" ]];
then echo "\\[\\033[0;32m\\]";
else echo "\\[\\033[0;31m\\]";
fi`[\u@\h \w]\[\e[m\] "'

export PS1

' >> /home/USER/.bashrc

私は何を見逃していますか?

ベストアンサー1

他の答えで述べたように、問題は入れ子になった引用符です。

確認してください。Bashで参照がどのように機能するか。簡単に言うと、引用符(すべての型、単一'、二重、"または逆引用符`)はほぼ常に同じタイプの参照が最初に表示されるものと一致する必要があります。脱出する一致しないように引用符を使用します(ただし、単一引用符はエスケープできません')。

したがって、(1)のアポストロフィはwhat's一重引用符を次のように囲みますecho '

echo '
# what's my pub. ip?

つまり、echoコマンドが終了するとすぐに、残り... ip?はbashによってコマンドとして実行されますが、これは明らかに意図されていません。

〜のようにラジェシュの答え提案、使用ここのドキュメント多くの引用問題を修正しました。

echo >> /home/USER/.bashrc <<'__EOF__'
# what's my pub ip?
echo "we can nest quotes in here"
__EOF__

(2) それから、報告されたようにスーパーソーブレードの回答、その行の引用符が正しく一致しません。

alias myip="curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1"

行の最初と最後の(二重引用符)文字を一致させたい場合がありますが、"bashは行に表示される順序(左から右)に一致するため、左側の二重引用符は後続の"http://...引用符を閉じますalias myip="。同様に、| grep -o| head -1は次のように扱われます。以内に引用符、http://...そして[0-9]*\....いいえ。 (この場合、バックスラッシュが表示されない以外は深刻な構文結果はありませんが、 grep後で使用するためにこの点に注意してください。)

1つの解決策は二重引用符(およびバックスラッシュをエスケープすることです。バックスラッシュは二重引用符内の特別な意味を失わないためです):

alias myip="curl -s \"http://checkip.dyndns.org/\" | grep -o \"[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*\" | head -1"

この場合に機能する別の回避策は、エイリアスを定義するために一重引用符を使用することです '

alias myip='curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1'

またはエイリアス定義のコマンドの場合:

alias myip="curl -s 'http://checkip.dyndns.org/' | grep -o '[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*' | head -1"

(3)最後に、次の行で:

export PROMPT_COMMAND='PS1="`
if [[ \$? = "0" ]];

'次の(一重引用符)文字は、PROMPT_COMMAND=1行で終わる新しい複数行の一重引用符文字列を開始すると解釈されます。

fi`[\u@\h \w]\[\e[m\] "'

'したがって、別の一重引用符で囲まれた文字列は最後の行の文字で始まりますが、bashは一致する一重引用符を決して見ることができません。したがって、次のエラーが発生します。

unexpected EOF while looking for matching `''

おすすめ記事