GNU/Linux >> Linux の 問題 >  >> Linux

初心者のためのBashヒアドキュメントチュートリアル

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

ヒアドキュメントでのリダイレクトとパイプ

出力リダイレクト演算子をヒアドキュメントと組み合わせて、出力を端末に出力する代わりにファイルにリダイレクトすることができます。

前のセクションで使用したのと同じ例を使用して、出力を 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

ヒアドキュメントの出力は、パイプに送信できます。 さらに処理するための演算子。

$ 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スクリプティング–ループの説明中およびループまで

Linux
  1. 例を使用したBashヒアドキュメントチュートリアル

  2. 初心者向けのLinuxcdコマンドチュートリアル(8例)

  3. 初心者向けのLinux日付コマンドチュートリアル(8例)

  1. 初心者向けのLinux通信コマンドチュートリアル(5例)

  2. 初心者向けのLinuxdfコマンドチュートリアル(8例)

  3. 初心者向けのLinuxduコマンドチュートリアル(10例)

  1. 初心者向けのLinuxechoコマンドチュートリアル(5つの例)

  2. 初心者向けのLinuxenvコマンドチュートリアル(5つの例)

  3. 初心者向けのLinuxサイズのコマンドチュートリアル(6つの例)