用简单脚本创建的 0 字节文件

用简单脚本创建的 0 字节文件

我有一个脚本如下:

#!/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 脚本的一般注释:

  1. 赞成[[表达式]] 而不是 [表达式] 因为它更强大并且可以更好地处理空字符串。
  2. 在字符串周围使用双引号,除非您有理由不这样做,例如:摆脱换行符。
  3. 添加大括号:${var} 而不是 $var —— 它通常可以消除阅读时的混乱,并允许变量与文本相邻,例如:echo "剩余: ${kb}KB"
  4. 一般来说,尽可能避免创建临时文件。而是在阶段之间使用管道。
  5. 如果您正在使用工具(例如awk)然后学习如何使用它的威力,它会让你的代码更加简洁,并且更容易阅读别人的代码。
  6. 正确缩进你的代码(也许你在现实中做了但不是在帖子中)。
  7. 如果您打算输入感叹号(“!”),请使用设置+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

这是计算磁盘空间的一种有效方法。在此示例中,我使用的是/homedir.

#!/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}'

相关内容