昨日の続きで、シェルスクリプトのデバッグ機能を利用してコードを書く。
今回やろうとしているのは、dfコマンドで取得したハードディスクの使用率が80%を超えている物を出力しようと言う物。
最初に書いたコードは以下
#!/bin/sh df | while read target; do usage=`echo $target | awk '$1 ~ /:$/ {print $5;}' | sed s/%//g` if [ $usage -ge 70 ]; then volume=`echo $target | awk '{print $1;}'` echo $volume is used $usage %... fi done
4行目のawkで、Windowsのパーティションの情報のみを正規表現で得ている、つもり、なのだがうまく動いていない。
ちなみに、dfコマンドの出力結果は
\ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 E:/cygwin/bin 74035520 33040348 40995172 45% /usr/bin E:/cygwin/lib 74035520 33040348 40995172 45% /usr/lib E:/cygwin 74035520 33040348 40995172 45% / C: 167132192 117595092 49537100 71% /cygdrive/c D: 732555928 386095748 346460180 53% /cygdrive/d E: 74035520 33040348 40995172 45% /cygdrive/e F: 51705168 292732 51412436 1% /cygdrive/f G: 472576040 76612632 395963408 17% /cygdrive/g H: 594027440 184795676 409231764 32% /cygdrive/h I: 594035472 93392484 500642988 16% /cygdrive/i J: 732563992 414357640 318206352 57% /cygdrive/j K: 488391676 368850304 119541372 76% /cygdrive/k L: 6918814 6918814 0 100% /cygdrive/l Y: 356670332 102977136 253693196 29% /cygdrive/y
こんな感じ。1フィールド目が : で終わるもののみを取得している、つもり。うーん・・・
こういうことも
sh -x
で分かる。上記のコードを実行すると
+ df + read target ++ echo $'\203t\203@\203C\203\213\203V\203X' $'1K-\203u\203\215\203b\203N' $'\216g\227p' $'\216g\227p\211\302' $'\216g\227p%' 'マウント位置' ++ awk '$1 ~ /:$/ {print $5;}' ++ sed s/%//g + usage= + '[' -ge 80 ']' hdd_checker.sh: line 5: [: -ge: unary operator expected + read target ++ echo E:/cygwin/bin 74035520 33040348 40995172 45% /usr/bin ++ awk '$1 ~ /:$/ {print $5;}' ++ sed s/%//g + usage= + '[' -ge 80 ']' hdd_checker.sh: line 5: [: -ge: unary operator expected + read target ++ echo E:/cygwin/lib 74035520 33040348 40995172 45% /usr/lib ++ awk '$1 ~ /:$/ {print $5;}' ++ sed s/%//g + usage= + '[' -ge 80 ']' hdd_checker.sh: line 5: [: -ge: unary operator expected + read target ++ echo E:/cygwin 74035520 33040348 40995172 45% / ++ awk '$1 ~ /:$/ {print $5;}' ++ sed s/%//g + usage= + '[' -ge 80 ']' hdd_checker.sh: line 5: [: -ge: unary operator expected + read target ++ echo C: 167132192 117588328 49543864 71% /cygdrive/c ++ awk '$1 ~ /:$/ {print $5;}' ++ sed s/%//g + usage=71
変数$usageの中に適切な値が入っていないので、if文で怒られているわけだ。と、まあここまで書いて気づいたけど、awkは確かに処理をしていない。
というか、処理をしていないからこそ、usage変数に何も入らなくなってifで怒られている。
どうすれば良いのか・・・
ちなみに今回の場合、目的を達成するだけであればawkのみを利用して
#!/bin/sh df | awk '$1 ~ /:$/ {sub(/%/,"",$5); if($5+0 >= 70) print $1 " is used " $5"%"}'
そんな、目的と手段を見失った日曜の午前中・・・。
0 件のコメント:
コメントを投稿