
シェルスクリプトを作成するときに、テキストまたはコードの複数行のブロックをtee
などのインタラクティブコマンドに渡す必要がある場合があります。 、cat
、またはsftp
。
BashやZshのような他のシェルでは、ヒアドキュメント(Heredoc)は、コマンドに複数行の入力を渡すことができるリダイレクトの一種です。
ヒアドキュメントの記述構文は次の形式を取ります:
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
- 最初の行はオプションのコマンドで始まり、その後に特別なリダイレクト演算子
<<
が続きます および区切り識別子。- 任意の文字列を区切り識別子として使用できます。最も一般的に使用されるのはEOFまたはENDです。
- 区切り識別子が引用符で囲まれていない場合、シェルはヒアドキュメント行をコマンドに渡す前に、すべての変数、コマンド、および特殊文字を置き換えます。
- リダイレクト演算子にマイナス記号を追加する
<<-
、すべての先頭のタブ文字が無視されます。これにより、シェルスクリプトでヒアドキュメントを作成するときにインデントを使用できます。先頭の空白文字は使用できません。タブのみです。
- ヒアドキュメントブロックには、文字列、変数、コマンド、その他の種類の入力を含めることができます。
- 最後の行は区切り識別子で終わります。区切り文字の前に空白を入れることはできません。
基本的なヒアドキュメントの例#
このセクションでは、ヒアドキュメントの基本的な使用例をいくつか見ていきます。
ヒアドキュメントは、ほとんどの場合、catコマンドと組み合わせて使用されます。
次の例では、環境変数とコマンドを含む2行のテキストをcat
に渡します。 ヒアドキュメントを使用します。
cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
以下の出力からわかるように、変数とコマンド出力の両方が置き換えられます。
The current working directory is: /home/linuxize
You are logged in as: linuxize
区切り文字を一重引用符または二重引用符で囲むとどうなるか見てみましょう。
cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
区切り文字が引用されている場合、パラメーターの展開やコマンド置換はシェルによって行われないことに気付くでしょう。
The current working directory is: $PWD
You are logged in as: $(whoami)
ステートメントまたはループ内でヒアドキュメントを使用している場合は、<<-
を使用してください コードをインデントできるリダイレクト操作。
if true; then
cat <<- EOF
Line with a leading tab.
EOF
fi
Line with a leading tab.
画面に出力を表示する代わりに、>
を使用してファイルにリダイレクトできます。 、>>
演算子。
cat << EOF > file.txt
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
file.txtが存在しない場合は、作成されます。 >
を使用する場合 >>
の間、ファイルは上書きされます 出力をファイルに追加します。
ヒアドキュメント入力もパイプ処理できます。次の例では、sed
コマンドは、l
のすべてのインスタンスを置き換えます e
の文字 :
cat <<'EOF' | sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored
パイプされたデータをファイルに書き込むには:
cat <<'EOF' | sed 's/l/e/g' > file.txt
Hello
World
EOF
SSHでのヒアドキュメントの使用#
ヒアドキュメントの使用は、SSHを介してリモートシステムで複数のコマンドを実行するための最も便利で簡単な方法の1つです。
引用符で囲まれていない区切り文字を使用する場合は、すべての変数、コマンド、および特殊文字をエスケープするようにしてください。エスケープしないと、ローカルで補間されます。
ssh -T [email protected] << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: \$PWD"
EOF
The current local working directory is: /home/linuxize
The current remote working directory is: /home/user
SSHキーベースの認証を設定し、パスワードを入力せずにLinuxサーバーに接続することもできます。
結論#
このガイドでは、heredoc
とは何かを学びました。 シェルスクリプトでの使用方法。
ご質問やご意見がございましたら、お気軽にコメントをお寄せください。