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

Bashスクリプト:バッククォート演算子から$括弧への移動

システム管理者として使い始める特定のコマンドやトリックがあります。これらは単に武器庫に組み込むだけで、すべてのオプションや代替案を詳細に分析するために停止することはありません。

私にとって、それらのトリックの1つはバッククォート演算子です。 Perlでプログラミングしたときはかなり頻繁に使用しました(最近は使用していませんが、まだ忠実なファンクラブがあるようです。この投票を確認してください)。私のPerlスクリプトでは、バッククォート演算子を使用してオペレーティングシステムでコマンドを実行し、出力を返してスクリプトのロジックを続行します。

[次のこともお勧めします:Bashスクリプト:テキストファイルにデータを書き込む方法]

バッククォート演算子はシェルスクリプトでも使用でき、他のコマンドと組み合わせるのがとても簡単なので、私はそれをたくさん使い始めました。ただし、 $ を使用して、同じことを行うためのより「推奨される」方法があります。 括弧(括弧)演算子。

この記事では、シェルスクリプトで使用するそれぞれの長所と短所を紹介します。

バックティックの基本機能

Open Groupには、正式にはコマンド置換と呼ばれるバッククォート演算子の定義があります。この演算子はではありません 一重引用符ですが、アクサングラーブと呼ばれる別の文字 ( `

アイデアは単純です:

❯ echo "There are `ls | wc -l` files in this directory"
There are 3 files in this directory

非常に単純なコマンドのグループls| wc -l <​​/ code> これは、現在のディレクトリ内のファイルの数を一覧表示してカウントするために使用します。これをインタラクティブに簡単に実行して、結果を正確に確認できます。次に、メインの echoに埋め込むことができます コマンド。

シェルスクリプトでは、確かに同じことを実行して、countコマンドの結果を変数に割り当て、後でその変数を使用することができます。

❯ file_count=`ls | wc -l`
❯ echo "There are $file_count files in this directory"
There are 3 files in this directory

そしてもちろん、アイデアが再利用であるならそれはより良いでしょう 値、または実行する操作が私の例のように単純ではなかった場合。

バックティックを使用してコマンドを埋め込むことは、私が「迅速で汚いトリック」として分類するものです。

$ parens

バックティックを$に置き換えることで、同じ結果を得ることができます。 以下の例のように、parens:

❯ echo "There are $(ls | wc -l) files in this directory"
There are 3 files in this directory

別の例を次に示します。これはまだ非常に単純ですが、もう少し現実的です。 何かのトラブルシューティングが必要です ネットワーク接続で、合計接続数と待機中の接続数を1分ごとに表示することにしました。

❯ cat netinfo.sh
#!/bin/bash
while true
do
  ss -an > netinfo.txt
  connections_total=$(cat netinfo.txt | wc -l)
  connections_waiting=$(grep WAIT netinfo.txt | wc -l)
  printf "$(date +%R) - Total=%6d Waiting=%6d\n" $connections_total $connections_waiting
  sleep 60
done

❯ ./netinfo.sh
22:59 - Total=  2930 Waiting=   977
23:00 - Total=  2923 Waiting=   963
23:01 - Total=  2346 Waiting=   397
23:02 - Total=  2497 Waiting=   541

巨大のようには見えません 違いですね構文を調整する必要がありました。さて、2つのアプローチを含むいくつかの含意があります。まばたきもせずにバックティックを自動的に使用する私のような人は、読み続けてください。

非推奨と推奨事項

非推奨 悪い言葉のように聞こえますが、多くの場合、それは本当に悪い言葉かもしれません。

バッククォート演算子の説明を調べていたときに、「バッククォート演算子は非推奨ですか?」という議論がいくつか見つかりました。

簡単に言うと、「サポートされなくなり、機能しなくなる寸前」という意味ではありません。ただし、バックティックは避け、 $に置き換える必要があります parens構文。

その主な理由は(順不同):

1.内部コマンドもバックティックを使用している場合、バックティック演算子が乱雑になる可能性があります。

  • 内部のバッククォートをエスケープする必要があります。コマンドまたは結果の一部として一重引用符を使用すると、スクリプトの読み取りとトラブルシューティングが困難になる可能性があります。
  • ネスティングについて考え始めたら 他のバッククォート演算子内のバッククォート演算子では、期待どおりに機能しないか、まったく機能しません。気にしないでください。

2. $ parens演算子は、より安全で予測可能です。

  • $内でコーディングするもの parens演算子は、シェルスクリプトとして扱われます。構文的には、そのコードをテキストファイルに含めるのと同じことなので、分離されたシェルスクリプトでコーディングするすべてのものがここで機能することが期待できます。

バックティックと$の動作の違いの例を次に示します。 パレンス:

❯ echo '\$x'
\$x

❯ echo `echo '\$x'`
$x

❯ echo $(echo '\$x')
\$x

バックティックと$の違いの追加の例を見つけることができます ここでの親の行動。

[無料のチートシート:サーバーとネットワークを管理するためのLinuxユーティリティとコマンドのリストを入手してください。 ]

まとめ

2つのアプローチを比較すると、常に/ $のみを使用する必要があると考えるのが論理的です。 パレンスアプローチ。また、バッククォート演算子は、古い時代のシステム管理者だけが使用していると思うかもしれません。

まあ、それは本当かもしれません。私はずっと前に学んだことを使うことがあり、単純な状況では、私の「筋肉の記憶」がそれをコード化するだけです。厄介な文字が含まれていないことがわかっているアドホックコマンドの場合は、バッククォートを使用しても問題ない可能性があります。しかし、より永続的またはより複雑/洗練されたものについては、 $を使用してください パレンスアプローチ。


Linux
  1. Bashシェルスクリプトで文字列を比較する方法

  2. [ :シェル プログラミングの予期しない演算子

  3. URLからbashスクリプトを実行

  1. Bashスクリプト(I)

  2. bashスクリプトが同時に実行されないようにする

  3. bash から apachectl を起動する

  1. Bashブレーク:ループを終了する方法

  2. 現在のシェルから.bashrcを再生成しますか?

  3. bashにgotoステートメントはありますか?