Unixステートメントの解読

Unixステートメントの解読

ここで言う内容を解釈してみましょう。

export IP=`/sbin/ifconfig | grep 'inet addr:'|grep -v '127.0.0.1'|
    cut -d: -f2 | awk '{print $1}'`

IPを環境変数に設定することはわかりますが、それ以外は何を意味しますか?

答え1

システムのすべての非ループバックIPアドレスが一覧表示されます。このシステムにループバックではなく IP アドレスが 1 つしかないと仮定すると、システムの IP アドレスが環境変数「IP」としてエクスポートされます。

一度に1つの「セクション」のパイプラインを実行して起動します。つまり、初めて走るとき

/sbin/ifconfig

それが何をしているのか見てください。それでは走ってください...

/sbin/ifconfig | grep 'inet addr:'

そしてそこからずっと進みなさい。

答え2

多くのことが起こっています。最初:

export IP=`...`

バックティック(単一引用符ではなく、注意してください)の間でコマンドを実行し、その出力を「IP」という変数の値として使用することを意味します。 「エクスポート」は、すべての子プロセスが「IP」という変数とその値を継承することを意味します。

コマンドはパイプであり、各コマンドの標準出力は次のコマンドの標準入力に供給されます。/sbin/ifconfigネットワークインタフェースに関する情報のリストを生成します。 ifconfigのすべての出力行はに入力されますgrep 'inet addr:'。 Grepは、単に最初の引数と部分的に一致するテキスト行、つまり正規表現というパターンを渡します。

このコマンドは、grep -v '127.0.0.1'一致しないテキスト行のみを渡します。 127.0.0.1は「ループバック」IPアドレスです。私たち全員が知っているように、私たちは「IP」という変数の値にその情報を含めたくありません。

このコマンドは、cut -d: -f2入力内の各行の2番目のフィールドを印刷します。フィールドは「:」(セミコロン)で区切られます。このawk '{print $1}'コマンドは、スペースで区切られた最初の列のみを印刷します。

TheDudeが書いたように、ループバック以外のすべてのIPアドレスをシェル環境変数IP値に文字列として入れます。

答え3

注:ifconfigは通常複数の接続(ループバック接続を除く)を表示するため、このコードは各IPアドレスが改行で次のIPアドレスと区別される文字列変数を生成します。私の外観は次のとおりです。

bigbird@sananda:~/pq$ export IP=`/sbin/ifconfig | grep 'inet addr:'|\
grep -v '127.0.0.1'| cut -d: -f2 | awk '{print $1}'`
bigbird@sananda:~/pq$ echo "[${IP}]"
[192.168.126.1
192.168.114.1
192.168.1.2]
bigbird@sananda:~/pq$

実際に使用するには、追加の解析(改行から文字列分割)が必要な場合があります。

これを処理する1つの方法は、IPアドレス文字列を配列要素に配置することです。

export IP=($(/sbin/ifconfig | grep 'inet addr:'|grep -v '127.0.0.1'| cut -d: -f2 |\
awk  '{printf "%s ", $1}'))

for (( I=0; I<${#IP[@]}; I++ ))
do
  echo "${I} [${IP[${I}]}]"
done

bigbird@sananda:~/bin$ mytest
0 [192.168.126.1]
1 [192.168.114.1]
2 [192.168.1.2]
bigbird@sananda:~/bin$ 

追加された括弧()は、出力を配列要素に変換します。 printは、各IPの後にスペース(デフォルトのbash区切り文字)を追加し、改行文字を削除するためにprintfに変更されました。バックティック記号:

`...`

コマンド出力を文字列に変換する方法も、更新された構文 $(...) に置き換えられました。

for ループは、結果を表示して結果にアクセスする方法として含まれます。

関連情報