我正在编写一个代码,它接受一个以兆字节为单位的整数,我的目的是循环遍历我的机器中的用户,并回显其主目录使用量超过该兆字节量的任何用户的名称。因此,我的策略是获取一个数字,将其从千字节转换为兆字节,循环遍历我的计算机中每个人的主目录并回显他们的用户名。
因此我的代码如下:
#!/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))
并且您可以转到下一个错误以重复该过程。