首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当管道切割时,请检查双引号变量的建议不起作用。

当管道切割时,请检查双引号变量的建议不起作用。
EN

Ask Ubuntu用户
提问于 2020-09-27 20:16:39
回答 2查看 612关注 0票数 1

我正在制作一个打印ZFS文件系统信息的脚本--目前正处于测试阶段,而且我收到了一个奇怪的错误。

我的初步脚本的相关部分是:

代码语言:javascript
复制
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"

给出以下输出:

代码语言:javascript
复制
zfs                      2.31M  5.27T     34.4K  /mnt/zfs
zfs                      5.3T  128K  5.3T   1% /mnt/zfs
2.31M
5.3T

但是,当我运行shellcheck时,它说我应该双引号引用命令替换中的变量名,这是shellcheck的输出:

代码语言:javascript
复制
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的建议:

代码语言:javascript
复制
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"

但现在输出如下:

代码语言:javascript
复制
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

有人能解释一下吗?谢谢。

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2020-09-28 19:35:18

-H添加到zfs将通过一个选项卡而不是任意空格删除头和单独的字段,这大大简化了解析。因为df没有删除标头的选项,所以findmnt将是一个更好的选择。

代码语言:javascript
复制
#!/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一样,所以您必须回到传统的数学。

代码语言:javascript
复制
#!/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
票数 1
EN

Ask Ubuntu用户

发布于 2020-09-28 09:03:15

根据@steeldrivers的建议,我用awk代替了D1,这是按照预期工作的。

代码语言:javascript
复制
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进行字符串拆分是一致的。

票数 0
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1278207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档