我正在制作一个打印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行为空,这意味着第3和第4命令替换在遵循shellcheck的建议时不起作用,但如果不引用我回显的变量,则有效。
我在Ubuntu 20.04.1上使用Bash 5.0.17
有人能解释一下吗?谢谢。
发布于 2020-09-28 19:35:18
将-H添加到zfs将通过一个选项卡而不是任意空格删除头和单独的字段,这大大简化了解析。因为df没有删除标头的选项,所以findmnt将是一个更好的选择。
#!/bin/bash
# zfs
read -r zfs_usedh < <(zfs list -H -o used)
# df
read -r zfs_totah < <(findmnt -frnt zfs -o size)
echo "$zfs_usedh"
echo "$zfs_totah"没有总大小,与df一样,所以您必须回到传统的数学。
#!/bin/bash
read -d \\n -r avail used total < <(zfs get -Hpo value available,used | \
awk 'NR < 3 { n+=$1; print $1 } END { print n }' | numfmt --invalid=ignore --to=iec \
)
printf %s\\n $used $total发布于 2020-09-28 09:03:15
根据@steeldrivers的建议,我用awk代替了D1,这是按照预期工作的。
zfs_human="$(zfs list | head -n 2 | tail -n 1)"
dfs_human="$(df -h | grep 'zfs' | head -n 1)"
zfs_usedh="$(echo "$zfs_human" | awk -F " " '{print $2}')"
zfs_totah="$(echo "$dfs_human" | awk -F " " '{print $2}')"
echo "$zfs_human"
echo "$dfs_human"
echo "$zfs_usedh"
echo "$zfs_totah"为了保持一致性,我认为这是保留shellcheck建议的语法的最佳解决方案,因此,除非有特定的理由使用cut,否则使用awk over cut进行字符串拆分是一致的。
https://askubuntu.com/questions/1278207
复制相似问题