如何获取磁盘使用情况并将其与 bash 中的打印信息进行比较

如何获取磁盘使用情况并将其与 bash 中的打印信息进行比较

我正在编写一个代码,它接受一个以兆字节为单位的整数,我的目的是循环遍历我的机器中的用户,并回显其主目录使用量超过该兆字节量的任何用户的名称。因此,我的策略是获取一个数字,将其从千字节转换为兆字节,循环遍历我的计算机中每个人的主目录并回显他们的用户名。

因此我的代码如下:

#!/bin/bash
#https://unix.stackexchange.com/questions/199220/how-to-loop-over-users

size=$(($1 * 1000000))
getent passwd | while IFS=: read -r name password uid gid gecos home shell; do
  du -sh $home | awk '{$1}'
  if [ $i -ge  size]
  then
    echo $name
  fi
done

循环只是循环遍历用户,它是孤立执行的,awk 的目的是仅捕获磁盘使用情况的数字,这似乎也循环遍历我的所有目录,但没有这样做的权限:

du: cannot read directory '/etc/vpnc': Permission denied
du: cannot read directory '/etc/credstore': Permission denied
du: cannot read directory '/etc/ssl/private': Permission denied

另外,当我尝试将其与我的磁盘使用限制进行比较时:

if [ $i -ge  size]

它说没有找到这一行,是因为 awk 没有正确捕获大小,如果是这样,我将如何比较输入与 home direct 或 du 大小

7: [: missing ]

谢谢

答案1

写了一个脚本却发现行不通,这是很正常的事情。您在这里缺少的是基本的故障排除。问题是这样的:

  • 脚本的未知部分被破坏。
  • 您试图修复脚本,但没有找到损坏的部分。

您需要的策略是一个两步过程:

  • 找到重现错误所需的最简单的代码段。
  • 修复代码以解决该错误。

让我们看一下您的第一条错误消息:

4: 20: not found

4:意味着第 4 行,所以我们要检查该行:size=$($1 * 1000000) 这里您使用语法$1,因此我将尝试将代码放入 bash 函数中,以便我可以使用参数调用它(因此使用相同的$1语法:

bash-3.2$ function test_code { size=$($1 * 1000000); }
bash-3.2$ test_code 20
bash: 20: command not found

足够接近了(也许你正在使用不同版本的 bash) - 我们有重现了错误现在我们可以尝试修复该代码。一点点经验在这里很有帮助,因为20:可能会再次被解释为行号。但实际上它只是参数的值:

bash-3.2$ test_code example
bash: example: command not found

date如果您命名一个存在的命令,例如以下命令,则这里的问题会更加明显:

bash-3.2$ test_code date
date: illegal time format
usage: date [-jnRu] [-I[date|hours|minutes|seconds]] [-f input_fmt]
            [-r filename|seconds] [-v[+|-]val[y|m|w|d|H|M|S]]
            [[[[mm]dd]HH]MM[[cc]yy][.SS] | new_date] [+output_fmt]

您的代码并不尝试将参数乘以1000000,而是尝试将该参数视为命令名称并执行该命令:

  • 您希望代码将两个值相乘并存储结果。
  • 相反,代码将给定值作为命令执行。

因此,您需要谷歌搜索“在 bash 中将两个值相乘”。 Google 给了我这个 Unix 和 Linux 问题:bash 脚本中的算术

我们看到:

您可以使用$((expr))符号来做到这一点。

$ echo $((6 + 6))
12
$ echo $((6 * 6))
36

如果我们将其与我们的代码进行比较,问题就变得显而易见:

bash-3.2$ function test_code { echo $($1 * 1000000); }
bash-3.2$ test_code 20
bash: 20: command not found

即,echo $($1 * 1000000)仅使用一对()括号,而示例echo $((6 * 6))代码使用两个。让我们看看是否可以修复此代码:

bash-3.2$ function test_code { echo $(($1 * 1000000)); }
bash-3.2$ test_code 20
20000000

现在可以更新脚本的第 4 行,size=$(($1 * 1000000))并且您可以转到下一个错误以重复该过程。

相关内容