ここで言う内容を解釈してみましょう。
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 ループは、結果を表示して結果にアクセスする方法として含まれます。