我有一个脚本如下:
#!/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 的零字节文件。您知道为什么会发生这种情况吗?
$ 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用于数值比较的运算符;您正在做的是保存命令的(空)输出“[ $percentUsed ]” 到名为“75”的文件中。
该脚本正在正确执行,但是,它正在创建一个名为 75 的零字节文件。您知道为什么会发生这种情况吗?
它没有正确执行。这 ”[ $percentUsed ]" 如果字符串非空,则命令返回 true,对于此脚本来说始终如此,因此它将总是取 if 语句的第一个分支。
因为$已使用百分比不是一个整数(它有一个尾随'%')可以使用${percentUsed%[%]}从变量中删除尾随的“%”,或者在 awk 中添加零,如 @val0x00ff 所建议的。
bash 脚本的一般注释:
- 赞成[[表达式]] 而不是 [表达式] 因为它更强大并且可以更好地处理空字符串。
- 在字符串周围使用双引号,除非您有理由不这样做,例如:摆脱换行符。
- 添加大括号:${var} 而不是 $var —— 它通常可以消除阅读时的混乱,并允许变量与文本相邻,例如:echo "剩余: ${kb}KB"
- 一般来说,尽可能避免创建临时文件。而是在阶段之间使用管道。
- 如果您正在使用工具(例如awk)然后学习如何使用它的威力,它会让你的代码更加简洁,并且更容易阅读别人的代码。
- 正确缩进你的代码(也许你在现实中做了但不是在帖子中)。
- 如果您打算输入感叹号(“!”),请使用设置+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 上它可以工作。注意:请仅使用一个反引号,而不是此处显示的两个反引号 - 这是因为 Stackexchange Web 平台会解释这些反引号。
答案3
这是计算磁盘空间的一种有效方法。在此示例中,我使用的是/home
dir.
#!/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}'