
次のスクリプトがあります。
#!/bin/bash
df -k | tr -s " " "," | awk 'BEGIN {FS=","} {print $1,$5}'|sed 1d > file1.txt
while read partition percentUsed
do
if [ $percentUsed > 75 ]
then
echo Partition: ${partition} space is ${percentUsed}
else
echo Pration: $partition: OK!!
fi
done < file1.txt
スクリプトは正しく実行されていますが、75という0バイトのファイルが生成されます。なぜこれが起こるのか知っていますか?
$ sh diskUsed.sh
Partition: C:/Users/Public/Documents/CYGWIN/bin space is 75%
Partition: C:/Users/Public/Documents/CYGWIN/lib space is 75%
Partition: C:/Users/Public/Documents/CYGWIN space is 75%
Partition: C: space is 75%
Partition: H: space is 91%
$ ls -lrt
total 2
-rwxrwxrwx 1 diwvibh Domain Users 284 Nov 21 04:17 diskUsed.sh
-rw-r--r-- 1 diwvibh Domain Users 133 Nov 21 04:29 file1.txt
-rw-r--r-- 1 diwvibh Domain Users 0 Nov 21 04:29 75
答え1
if [ $percentUsed > 75 ]
使用する必要があります-gt数値比較のための演算子です。現在実行中の作業は、コマンドの(空の)出力を保存することです。[ $%使用済み ]「75」というファイルとして保存します。
スクリプトは正しく実行されていますが、75という0バイトのファイルが生成されます。なぜこれが起こるのか知っていますか?
正しく実行されません。これ」[ $%使用済み ]文字列が空でない場合、このコマンドはtrueを返します。これは常にこのスクリプトの場合です。いつもif 文の最初の分岐を取得します。
なぜなら$% 使用済み整数ではありません(末尾に「%」があります)。使用できます。${パーセント使用%[%]}@val0x00ffが提案したように、変数から末尾の「%」を削除するか、awkに0を追加してください。
Bashスクリプトに関する一般的な注意:
- 同意する[[表現]]の代わりに[表現]より強力で、空の文字列をよりよく処理するためです。
- 特別な理由がない限り、文字列の周りに二重引用符を使用してください(改行文字の削除など)。
- 中かっこを追加: $var の代わりに ${var} - 読み込み時に混乱を取り除き、変数がテキストに隣接するようにします。例:echo "残額: ${kb}KB"
- 通常、可能であれば一時ファイルを生成しないでください。代わりに、ステップ間にパイプを使用してください。
- 次のツールを使用する場合アッ)次に、この機能を使用してコードをよりきれいにし、他の人のコードを読みやすくする方法を学びます。
- コードを正しくインデントしてください(実際の生活ではできますが、投稿ではできないかもしれません)。
- 感嘆符(「!」)を入力するには、次のようにします。セット+Hだから彼らはあなたを台無しにしないでしょうインタラクティブBashを介してレコードを挿入します。
以下はスクリプトの作業バージョンです。
#!/bin/bash +H
df -k | awk '(FNR>1){print $1,$5+0}' | while read partition percentUsed
do
if [[ $percentUsed -gt 75 ]]
then
echo "Partition: ${partition} space is ${percentUsed}% used"
else
echo "Partition: ${partition}: OK!!"
fi
done
Nit pick:80%を使用すると、「echo」行に「Partition /home space is 80」が出力され、多くの人が「space」を「」と読み込みます。無料スペース'、つまり20%です。
答え2
行5では、$percentUsedの内容が「75」ファイルに書き込まれます。代わりに、if [ ``echo $percentUsed | sed 's/%//'`` -gt 75 ]
どちらが何をすべきかを試してみてください。少なくともLinuxのbash 4.2.25では動作します。注:ここに示されている2つのバックティックではなく、1つのバックティックのみを使用してください。これは、Stackexchange Web プラットフォームがこれらのバックティックを解釈するためです。
答え3
これはディスク容量を計算する効率的な方法です。この例ではdirを使用しています/home
。
#!/bin/bash
{ read -r; read -rd '' -a disk_usage; } < <(LC_ALL=C df -Pk "/home"; printf \\0)
percent=$(echo "${disk_usage[4]}" | awk '{print $0+0}')
if (( percent > 75 )); then echo "Disk is critical"; else echo "Disk space is OK"; fi
参考までに、あなたのコマンドは次のとおりです
df -k | tr -s " " "," | awk 'BEGIN {FS=","} {print $1,$5}'|sed 1d
tr
、、、awk
など多くのプロセスを分岐するため、非常に非効率的ですsed
。一度にこれを行うことができます。+0
ロゴを表示するには、最後のロゴを削除してください%
。
df -k | awk 'NR>1{print $1,$(NF-1)+0}'