Bashが私のドキュメントテキストの構文をチェックするのはなぜですか?

Bashが私のドキュメントテキストの構文をチェックするのはなぜですか?

私のファイルには次のコードブロックがあります。

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にダンプすると、次の内容が表示されます。

関連情報