我正在制作一个脚本来打印 ZFS 文件系统信息 - 目前处于测试阶段,我遇到了一个奇怪的错误。
我的初始脚本的相关位是这样的:
zfs_human="$(zfs list | head -n 2 | tail -n 1)"
dfs_human="$(df -h | grep 'zfs' | head -n 1)"
zfs_usedh="$(echo $zfs_human | cut -d ' ' -f2)"
zfs_totah="$(echo $dfs_human | cut -d ' ' -f2)"
echo "$zfs_human"
echo "$dfs_human"
echo "$zfs_usedh"
echo "$zfs_totah"
给出以下输出:
zfs 2.31M 5.27T 34.4K /mnt/zfs
zfs 5.3T 128K 5.3T 1% /mnt/zfs
2.31M
5.3T
但是,当我运行时shellcheck
,它说我应该在命令替换中用双引号引起来,这是来自的输出shellcheck
:
In zfsspace.sh line 5:zfs_usedh="$(echo $zfs_human | cut -d ' ' -f2)" ^--------^
SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
zfs_usedh="$(echo "$zfs_human" | cut -d ' ' -f2)"
In zfsspace.sh line 6:zfs_totah="$(echo $dfs_human | cut -d ' ' -f2)" ^--------^
SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
zfs_totah="$(echo "$dfs_human" | cut -d ' ' -f2)"
然后我当然将我的代码更改为 shellcheck 的建议:
zfs_human="$(zfs list | head -n 2 | tail -n 1)"
dfs_human="$(df -h | grep 'zfs' | head -n 1)"
zfs_usedh="$(echo "$zfs_human" | cut -d ' ' -f2)"
zfs_totah="$(echo "$dfs_human" | cut -d ' ' -f2)"
echo "$zfs_human"
echo "$dfs_human"
echo "$zfs_usedh"
echo "$zfs_totah"
但现在输出是这样的:
zfs 2.31M 5.27T 34.4K /mnt/zfs
zfs 5.3T 128K 5.3T 1% /mnt/zfs
第 3 行和第 4 行是空白的,这意味着在遵循 shellcheck 的建议时,第 3 和第 4 个命令替换不起作用,但在不引用我回显的变量时起作用。
我在 Ubuntu 20.04.1 上使用 Bash 5.0.17
请问有人能解释一下吗???谢谢。
添加
-H
到 zfs 将通过单个选项卡而不是任意空格删除标题和分隔字段,这大大简化了解析。因为df
没有删除标题的选项,findmnt
将是一个更好的选择。没有总大小,
df
因此,您必须依靠传统数学。根据@steeldrivers 的建议,我用 , 替换
cut
了awk
,这按预期工作。为了保持一致性,我相信这是保留 推荐的语法的最佳解决方案
shellcheck
,因此始终使用awk
overcut
进行字符串拆分,除非有特定原因使用cut
.