2012年3月18日日曜日

[シェルスクリプト]デバッグを使ってコーデング[cygwin]





昨日の続きで、シェルスクリプトのデバッグ機能を利用してコードを書く。

今回やろうとしているのは、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 件のコメント:

コメントを投稿