首先,我是新来的,所以如果我犯了任何错误,我很抱歉。这是我的第一个问题。
我正在编写一个脚本来复制基于 Linux 的产品的日志文件。我已经完成了复制部分,但是我希望该脚本必须在复制日志之前验证 /var 分区大小。
以下是给我一个错误的脚本部分。
我希望如果 /var 分区大小小于 80%,它必须复制日志,否则必须退出。
size=`df -kh | grep var | awk '{print $5}'` #output is 1%, so it must execute other statements.
echo var partion $size utilized
if (( "$size" <= 79% ))
then
echo "/var partition is less than 80%"
else
exit
echo "/var partition is more than 79%"
fi
脚本的输出
[root@manage home]# sh logcopy.sh
var partion 1% utilized
logcopy.sh: line 19: ((: 1% <= 79% : syntax error: operand expected (error token is "<= 79% ")
脱离 awk 命令和 df -kh
[root@manage home]# df -kh | grep var | awk '{print $5}'
1%
[root@manage home]# df -kh
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 980M 642M 287M 70% /
/dev/sda1 95M 25M 65M 28% /boot
/dev/sda9 6.0G 1004K 5.7G 1% /home
/dev/sda7 4.6G 879M 3.5G 20% /usr/local
/dev/sda8 446G 2.7G 421G 1% /var
答案1
百分号是模运算符(例如8 % 5
is 3
),它需要第二个操作数。如果您使用过,错误将是类似的(( size <= 79% ))
,并且如果右侧本身size
不包含百分号,您会得到相同的错误。
因此,让我们从输入中删除百分号
size=$(df -kh | awk '$6 == "/var" {print $5}')
size=${size%"%"}
if (( size < 80 )); then
echo "/var is less than 80 % full"
fi
这里,${size%"%"}
是后缀删除扩展${var%word}
,第一个%
是语法的一部分,第二个(引用的)是%
我们要删除的。这里的引号是因为${var%%word}
相似,删除最长的匹配后缀而不是最短的。我们也可以使用,${size%%%}
但这样读起来更混乱。
答案2
df
您可以指定目标 ( df /var
),而不是针对所有磁盘运行
对于 GNU/Linux,可以格式化输出。最后你可以省略%
, tr
, sed substitution
...
df /var --output=pcent | tail -1 |tr -d '%'
55
只是如果您想使用awk
过度df
输出,最好使用 withdf -P
使其可移植。如果磁盘路径太长,那么您可能不会在一行中获得输出,例如:
df -kh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
3.9G 404M 3.3G 11% /
/dev/mapper/VolGroup00-LogVol05
3.9G 442M 3.3G 12% /home
/dev/mapper/VolGroup00-LogVol04
3.9G 261M 3.5G 7% /var
/dev/mapper/VolGroup00-LogVol03
3.9G 137M 3.6G 4% /tmp
/dev/mapper/VolGroup00-LogVol02
7.8G 3.6G 3.8G 49% /usr