私のファイルには次のコードブロックがあります。
175 MY_IP=`ifconfig eno1 | grep netmask | tr -s ' ' | cut -d " " -f 3`
176 echo "" > /home/hadoop/.ssh/config
177 cat > /home/hadoop/.ssh/config <<EOF
178 Host `echo $MY_IP | sed 's/.[0-9][0-9]*$//g'`.* 0.0.0.0 master worker*
179 StrictHostKeyChecking no
180 UserKnownHostsFile=/dev/null
181 EOF
ファイルに178〜181行を書きたいのですが、次のエラー出力が表示されます。
/script.sh: line 178: unexpected EOF while looking for matching `''
/script.sh: line 184: syntax error: unexpected end of file
構文を確認せずにそのテキストをコピーしないのはなぜですか?
更新:現在私のコードとエラーメッセージは次のとおりです。
175 MY_IP=`ifconfig eno1 | grep netmask | tr -s ' ' | cut -d " " -f 3`
176 echo "" > /home/hadoop/.ssh/config
177 cat > /home/hadoop/.ssh/config <<EOF
178 Host `echo $MY_IP | sed "s/.[0-9][0-9]*$//g"`.* 0.0.0.0 master worker*
179 StrictHostKeyChecking no
180 UserKnownHostsFile=/dev/null
181 EOF
182
183 chown -R hadoop:hadoop /home/hadoop
/script.sh: 行 175: 一致する "" の検索中に予期しない EOF が発生しました。
/script.sh: 行 184: 構文エラー: 予期しないファイルの終わり
解決済み:コードを確認した後、最初の行に一重引用符がないことがわかりました。他とペアリングすると問題が解決します。
答え1
シェルは`echo ...`
ここのドキュメントでさまざまな種類の拡張を行います(ユーザーのようなコマンドの置換だけでなく、変数や算術拡張も含みます)。区切り文字を引用しない限り。
比較する:
cat <<EOF
$$ $((2 + 3)) $(hostname) `date`
EOF
4502 5 fazq Mon Mar 11 23:03:27 EET 2019
比較:
cat <<'EOF'
$$ $((2 + 3)) $(hostname) `date`
EOF
$$ $((2 + 3)) $(hostname) `date`
最後のケースでは、二重引用符と一重引用符の両方が大丈夫です。
答え2
からman bash
:
ここにファイル
このタイプのリダイレクトは、シェルに次のようになるまで現在のソースから入力を読み取るように指示します。区切り文字のみを含む行(末尾の空白なし)見たことがあります。この時点までに読み取られたすべての行は、コマンドの標準入力(またはnが指定されている場合はファイル記述子n)として使用されます。
現在の質問に掲載されているように、EOF行には末尾のスペースが含まれています。削除してください。
答え3
ここには完全なスクリプトはありませんが、ここの引用符を一重引用符から二重引用符に変更するときに、「一致[一重引用符]を探している間に予期しないEOF」の行番号が178でどのように変更されるかを確認してください。 。
これは、実際の問題(未完成を参照)があなたが投稿したスニペットの前のどこかにあることを意味します。
たとえば、次のスクリプトでは実際エラーは明らかに最初の行にありますが、シェルの観点からは、そこから始まる引用符付き文字列は次の引用符まで続き、ペアレス文字列は次の文字列になりますbar
(構文の強調表示を参照してください)。 2番目はecho
引用されましたが、foo
そうではbar
ありません):
$ cat quote.sh
echo 'error here
echo 'foo' 'bar'
$ bash quote.sh
quote.sh: line 3: unexpected EOF while looking for matching `''
quote.sh: line 4: syntax error: unexpected end of file
2番目のecho
コマンドを変更して、echo "foo" "bar"
ライン1にエラーを表示します。これは、一重引用符で囲まれた最後の文字列が始まる行になるためです。
スクリプト全体をより詳しく見てください。または、shellcheck.netにダンプすると、次の内容が表示されます。