Bashスクリプトを使用する場合、同じコマンドを使用して一連の入力を処理しなければならない状況に陥る可能性があります。幸い、Bashには、 HereDocを使用してより最適な方法でこれを実現する方法があります。 。
ヒアドキュメント、ヒアドキュメントの頭字語 、は入力ですリダイレクト プログラムまたはコマンドに複数の入力を渡すメソッド。ヒアドキュメントの概念は、Bashだけに関連しているわけではありません。 Perl、Ruby、PHPなどの多くの一般的なプログラミング言語はヒアドキュメントをサポートしています。
この記事では、ヒアドキュメントの構文と使用法を実際のユースケースとともに見ていきます。この記事のすべての例は単純になるように作成されているため、初心者でもこの概念を簡単に理解できます。飛び込んで、Bashでヒアドキュメントを試してみましょう。
ヒアドキュメント構文
次の図は、ヒアドキュメントの構文を示しています。
ここで
- コマンド -リダイレクトを受け入れる任意のコマンド(cat、wc、mailなど)。
- リダイレクト演算子(
<<
) -ヒアドキュメントのデフォルトの演算子は<<
。コードのブロックをコマンドにリダイレクトして処理します。 - 区切り文字トークン -区切り文字トークンは、ドキュメント(コードブロック)の開始と終了を示します。区切り文字トークンは何でもかまいませんが、同一である必要があります。通常、
EOF
が表示されます 「ファイルストリームの終わり」を意味する区切り文字トークンとして使用されます。
Bashでヒアドキュメントを使用して複数行の文字列を印刷する
複数行の文字列をリダイレクトして端末に出力する簡単な例から始めましょう。
cat
コマンドは入力のストリームとヒアドキュメントを受け入れ、コードのブロックをリダイレクトして端末に出力できます。
$ cat << EOF Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF
出力:
Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <==
上記のコードスニペットを見てください。 cat
にリダイレクトされる3行があります 指図。 EOF
を使用しています 区切り文字として。ただし、好きなように使用できますが、開始区切り文字と終了区切り文字は同じにしてください。
もう1つの簡単な例を試してみましょう。同じ3行を単語数にリダイレクトしています プログラム。別の区切り文字(BLK
)を使用しています )ここ。
$ wc -l << BLK Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== BLK
出力例:
3
ヒアドキュメントでのリダイレクトとパイプh2>
出力リダイレクト演算子をヒアドキュメントと組み合わせて、出力を端末に出力する代わりにファイルにリダイレクトすることができます。
前のセクションで使用したのと同じ例を使用して、出力を log_op.txt
という名前のファイルにリダイレクトしています。 。
$ cat << EOF > /tmp/log_op.txt Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF
ヒアドキュメントの出力は、パイプstrong>に送信できます。 さらに処理するための演算子。
$ cat << EOF | grep -i sla Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF
ヒアドキュメントでのタブ抑制
コードブロックに空白(タブ)があり、それを抑制したい場合は、"-"
を使用します。 リダイレクト演算子の後。注意すべき重要な点は、スペースではなく、タブのみが抑制されることです。
以下の例を見てください。前のセクションで見たのと同じ例に条件文を追加しました。ヒアドキュメントの最初の2行はタブ付き(4)で、3行目は間隔が空けられています(2)。
if [[ $x = "err" ]] then cat <<- err_msg 1. Something is wrong with the input file received for today. 2. Contact the downstream team to get it corrected. 3. ==> SLA MISSED <== err_msg fi
コードスニペットが送信されると、出力は次のようになります。
1. Something is wrong with the input file received for today. 2. Contact the downstream team to get it corrected. 3. ==> SLA MISSED <==
ご覧のとおり、1行目と2行目のタブは抑制されていますが、3行目ではスペースが使用されているため抑制されていません。
ヒアドキュメントでの変数とコマンドの拡張
ヒアドキュメントコードブロック内で文字列のみを渡すことができるということではありません。ユーザー定義変数と環境変数を渡し、コードブロック内でコマンドを実行できます。
以下の例を見てください。コードブロック内に、1つのユーザー定義変数"${AUTHOR}"
があります。 、1つの環境変数"${SHELL}"
、外部コマンド"whoami"
。
このスニペットが送信されると、変数とコマンドが展開され、cat
にリダイレクトされます。 コマンド。
AUTHOR="OSTechNix" cat << EOF Author: ${AUTHOR} # USER DEFINED VARIABLE Article: Bash Heredoc I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
出力例:
Author: OsTechnix Article: Bash Heredoc I am using the /bin/bash shell karthick
開始区切り文字を一重引用符で囲んで、コードブロック内の展開を抑制することができます。このようにして、コードブロック内のすべてが文字列リテラルとして扱われます。
cat << 'EOF' Author: ${AUTHOR} # USER DEFINED VARIABLE Article: Bash Heredoc I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
出力例:
Author: ${AUTHOR} Article: Bash Heredoc I am using the ${SHELL} shell $(whoami)
ヒアドキュメントを使用した複数行のコメント
ご存知かもしれませんが、Bashは複数行のコメントをサポートしていません。ヒアドキュメントを使用すると、コードのブロックをno-op
にリダイレクトすることで、複数行のコメントを作成できます。 コマンド( :
)。
no-op
入力を受け取り、終了コードゼロを返すbash組み込みです。これは、bash組み込みの "true"の同義語と見なすことができます。 これも終了コード0を終了します。
: << 'COMMENTS' Author : OStechnix Article : Bash Heredoc BashV : 5.1.4 OS : PoP!_OS COMMENTS
ヘッズアップ: ほとんどすべてのテキストエディタには、複数の行を選択する機能があり、キーストロークを使用してコメントまたはコメント解除できます。このアプローチに固執することをお勧めします。
ヒアドキュメントでの特殊文字のエスケープ
コードブロックには特殊文字が含まれる場合があります。特殊文字をエスケープしたい場合は、それを実行する方法がいくつかあります。
区切り文字はシングルで囲むことができます または二重引用符 またはプレフィックスの円記号 区切り文字付き。このようにして、すべての特殊文字がエスケープされます。
# SINGLE QUOTES ESCAPE cat << 'EOF' I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
# DOUBLE QUOTES ESCAPE cat << "EOF" I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
# BACKSLASH ESCAPE cat << \EOF I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
すべての特殊文字をエスケープする代わりに、バックスラッシュを追加することで、ブロック内の特定の特殊文字をエスケープすることもできます。 特殊文字の前。
cat << EOF I am using the \${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
出力例:
I am using the ${SHELL} shell karthick
ヒアドキュメントのユースケース
これまで、ヒアドキュメントのコア構造とその基本的な使用法を見てきました。それでは、実際のユースケースをいくつか見てみましょう。私の経験では、sshを使用するときにヒアドキュメントを使用し、コマンドのグループを実行する必要があるデータベースクライアントを使用しました。
例1:スクリプト内で別のユーザーとして実行する
場合によっては、コードの特定の部分を別のユーザーとして実行したいことがあります。その場合、ヒアドキュメントを使用して、別のユーザーとして実行するようにコマンドをリダイレクトできます。
以下の例を見てください。コードのブロックをsu
にリダイレクトしています ユーザーを"ostechnix"に切り替えるコマンド testという名前のファイルを作成します 存在しない場合。
su - ostechnix << EOF if [[ ! -f /home/ostechnix/test ]];then touch /home/ostechnix/test echo "File Created" else echo "File exists" fi EOFをタッチします。
例2:DBクライアントでヒアドキュメントを使用する
データベースに対して一連のコマンドを実行する場合は、ヒアドキュメントが役立ちます。
以下の例を見てください。 MongoDBクライアントmongoshとやり取りしています ヒアドキュメント内では、コードブロックコマンドが渡されて、新しいデータベース、コレクションを作成し、サンプルドキュメントを追加します。
mongosh << EOF use ostechnix db.data.insertOne({ "Site" : "OsTechnix", "DB" : "Mongo" }) db.data.find().pretty() EOF
MongoDBを知っているかもしれないし、知らないかもしれませんが、それは問題ありません。これは、ヒアドキュメントを使用してdbクライアントと対話する方法を示すためだけのものです。使用しているデータベースに応じて、MySQL、psql、sqliteなどの任意のdbクライアントを使用できます。
例3:ヒアドキュメントとSSHを使用したリモートコマンドの実行
リモートサーバー上でコマンドを実行する場合は、ヒアドキュメントをssh
と組み合わせて使用できます。 指図。通常はssh
を使用します コマンドの場合、次の方法でリモートサーバーでコマンドを実行できます。
$ ssh [email protected] "command"
リモートホストでさらにコマンドを実行する場合は、同じコマンドを何度も繰り返す必要があります。ヒアドキュメントを使用すると、すべてのコマンドをグループ化して実行できます。
$ ssh -T [email protected] << EOF Command 1... Command 2.. ..... Command N.. EOF
同じコードを複数のノードで実行する必要がある場合は、for loop
を追加できます。 ヒアドキュメントと一緒に。最初の例で見たのと同じファイル作成スニペットを使用しています。
- 配列変数「server」はサーバー名のリストを保持します。
- forループは配列変数を繰り返し処理します。
- ファイル作成コマンドはSSHコマンドに渡され、SSHコマンドは各サーバーでファイルを繰り返し作成します。必ず
-T
を追加してください 疑似端末の割り当てを無効にするsshコマンドへのフラグ。
declare -a server=( host1 host2 host3 ) for host in ${server[@]} do ssh -T [email protected]${host} << EOF echo "Running at host - ${host}" if [[ ! -f /home/ostechnix/test ]];then touch /home/ostechnix/test echo "File Created" else echo "File exists" fi EOF done
結論
ヒアドキュメントは、Bashスクリプトで理解して使用するための重要な概念です。たくさんのスクリプトを書くと、ヒアドキュメントとそれを最適に使用する方法についてもっと知るようになります。
これまでヒアドキュメントを使用したことがない場合は、ターミナルを起動し、記事のすべてのコードスニペットを試して理解を深めてください。
関連記事:
- Bashスクリプティング–例で説明されている変数
- Bashスクリプト–例で説明されている関数
- Linuxの例で説明されているBashEchoコマンド
- Bashスクリプティング–例で説明されているForループ
- Bashスクリプティング–ループの説明中およびループまで