はじめに
ヒアドキュメント(ヒアドキュメント )は、個別のファイルとして機能するコードのセクションです。ヒアドキュメントは、入力ストリームを他のコマンドやプログラムに送信するための複数行の文字列またはファイルリテラルです。
ヒアドキュメントは、一度に複数のコマンドをリダイレクトする場合に特に便利です。これにより、Bashスクリプトがすっきりと理解しやすくなります。
この記事では、ヒアドキュメント表記の使用の基本といくつかの一般的な使用例について説明します。
前提条件
- sudoユーザーとしてのコマンドライン/ターミナルへのアクセス。
- Bashスクリプトを作成するためのテキストエディタ。
- 基本的なLinuxコマンド。クイックリファレンスについては、Linuxコマンドのチートシートを入手してください。
Bashヒアドキュメント構文
ヒアドキュメントを作成するための構文は次のとおりです。
[COMMAND] <<[-] 'DELIMITER'
Line 1
Line 2
...
DELIMITER
次の要素で構成されています:
COMMAND
オプションです。リダイレクトを受け入れるすべてのコマンドで機能します。-
<<
ヒアドキュメントをCOMMAND
に転送するためのリダイレクト演算子です。 。 -
-
タブ抑制のパラメータです。 -
DELIMITER
最初の行で、HereDoc区切り文字トークンを定義します。END
、EOT
、およびEOF
最も一般的ですが、本文に表示されない複数文字の単語はすべて機能します。コマンドと変数の拡張を可能にするために、最初の行で一重引用符を省略します。 -
DELIMITER
最後の行は、ヒアドキュメントの終わりを示しています。先頭に空白を入れずに、最初の行から同じ単語を使用します。
ヒアドキュメント自体には、文字列、変数、コマンド、およびその他の入力を含む任意の数の行が含まれています。
Bashヒアドキュメントの例
このセクションでは、さまざまな状況でヒアドキュメント表記を使用する方法を紹介します。最も一般的な使用例は、catコマンドを使用する場合です。
複数行の文字列
ターミナルを開き、 Enterを押して次のテキストを入力します 各行の後:
cat << EOF
Hello
World
EOF
cat
コマンドはヒアドキュメントを読み取り、その内容を端末に書き込みます。
変数の拡張
ヒアドキュメントは変数の使用を受け入れ、それらを読み取ります。
これがどのように機能するかを確認するには、ターミナルで2つの変数を作成します。
var1="Hello"
var2="World"
HereDocをcat
に渡します 2つの変数を環境変数と一緒に出力するコマンド:
cat << END
$var1
$var2
$PWD
END
すべての変数が展開され、それぞれの値が端末に出力されます。
コマンド拡張
HereDocsはコマンド置換を受け入れます。ターミナルで次のコードを1行ずつ実行して、結果を確認します。
cat << EOF
$(echo Hello)
$(whoami)
EOF
各コマンドを$()
に含めます ステートメントを評価し、結果をフェッチします。 $()
を省略します テキストを文字列として扱います。
変数とコマンドの拡張を無視する
HereDocの変数とコマンドの展開を無視するには、最初の区切り文字に一重引用符または二重引用符を追加します。
例:
cat << "EOF"
$(echo Hello)
$(whoami)
$PWD
EOF
区切り文字に引用符を追加すると、内容がヒアドキュメントリテラルとして扱われます。
パイプとリダイレクト
パイピングまたはリダイレクトを使用して、コマンド結果を別のコマンドに転送します。たとえば、Bashスクリプトを作成し、次のコンテンツを追加してコマンドをパイプします。
#!/bin/bash
cat << EOF | base64 -d
SGVsbG8KV29ybGQK
EOF
または、リダイレクト表記を使用して同じ結果を達成します。
#!/bin/bash
(base64 -d) < cat << EOF
SGVsbG8KV29ybGQK
EOF
Bashスクリプトを実行して、結果を確認します。
どちらの場合も、 cat
からの出力 ヒアドキュメントコマンドは、 base64 -d
にパイプ(またはリダイレクト)します 指図。その結果、スクリプトはヒアドキュメントからのメッセージをデコードします。
ファイルへの書き込み
HereDocを使用すると、1つのコマンドで複数行のドキュメントを作成できます。
ファイルを作成してヒアドキュメントの内容を保存するには、次の形式を使用します。
cat << EOF > hello_world.txt
Hello
World
EOF
ドキュメントが存在しない場合、コマンドはドキュメントを作成します。ファイルの内容を確認して確認してください:
cat hello_world.txt
コンソールにファイルの内容が表示されます。
タブ抑制
ダッシュを追加します( -
)先頭のタブを抑制するためのリダイレクト後。たとえば、次のスクリプトを作成して実行します。
#!/bin/bash
cat <<- EOF
Hello
World
EOF
タブを抑制しない場合、メッセージはインデント付きでコンソールに出力されます。ダッシュを追加すると、タブのインデントが削除され、先頭にスペースを入れずにメッセージが出力されます。
内部ステートメントとループ
ステートメントとループ内でヒアドキュメントを操作するときは、次の動作に注意してください。
- ステートメントとループ内のコード インデントされます。リダイレクト演算子の後にダッシュを追加して、インデントなしでヒアドキュメントからメッセージを印刷します。
- 終了区切り文字 その前にスペースやインデントを含めることはできません。
次のサンプルコードを試して、ifステートメント内でヒアドキュメントを使用する方法を確認してください。
#!/bin/bash
if true;
then
cat <<- "END"
Hello
World
END
fi
ダッシュは、プログラムの実行時にインデントが表示されないようにします。終了区切り文字はインデントされておらず、スペースを追加するとエラーが発生します。
複数行のコメント
nullコマンドを使用したヒアドキュメント(:
) Bashスクリプトでブロックコメントの効果を作成します。
例:
#!/bin/bash
: << 'END'
This is a comment
END
ブロックコメントとしてヒアドキュメント表記を使用することは、型にはまらないことです。一般に、Bashはブロックコメントをサポートしていません。
エスケープ文字
文字の解釈を避けるために、円記号を追加します( \
)文字の前:
cat << EOF
\$100
EOF
または、区切り文字をエスケープして文字の解釈を完全に回避します。
cat << \EOF
$100
EOF
この場合、区切り文字に引用符を使用することは同等です。
機能
ヒアドキュメントを介して情報を転送することにより、関数にパラメーターを追加します。たとえば、ヒアドキュメントを介して行を読み取り、情報を追加する関数を作成します。
#!/bin/bash
readLines(){
read greeting
read name
}
readLines << EOF
Hello
$USER
EOF
echo $greeting
echo $name
この関数は、ヒアドキュメントによって提供された情報を変数に格納します。
スクリプトを実行して、変数値を端末に出力します。
ヒアドキュメントとSSH
ヒアドキュメントは、リモートマシンで複数のコマンドを実行するのに便利です。複数のコマンドを実行するには、ヒアドキュメントをSSH接続に渡します。
例:
ssh [email protected] << EOF
echo "Local user: $USER"
echo "Remote user: \$USER"
EOF
このコマンドは、ローカルユーザーとリモートユーザーをコンソールに出力します。
ヒアドキュメントとSFTP
SFTPは、SSHプロトコルを介してデータを安全に転送するのに役立ちます。ヒアドキュメントを転送して、複数のSFTPコマンドを自動的に実行します:
sftp [email protected] << EOF
put test.sh
EOF
コードはサンプルファイルをリモートマシンにアップロードします。