AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1278207
Accepted
Artur Meinild
Artur Meinild
Asked: 2020-09-28 12:16:39 +0800 CST2020-09-28 12:16:39 +0800 CST 2020-09-28 12:16:39 +0800 CST

Shellcheck 对双引号变量的建议在管道切割时不起作用

  • 772

我正在制作一个脚本来打印 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

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

scripts bash pipe syntax
  • 2 2 个回答
  • 465 Views

2 个回答

  • Voted
  1. Best Answer
    user986805
    2020-09-29T11:35:18+08:002020-09-29T11:35:18+08:00

    添加-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
    
    • 1
  2. Artur Meinild
    2020-09-29T01:03:15+08:002020-09-29T01:03:15+08:00

    根据@steeldrivers 的建议,我用 , 替换cut了awk,这按预期工作。

    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,因此始终使用awkovercut进行字符串拆分,除非有特定原因使用cut.

    • 0

相关问题

  • 如何每 5 秒运行一次脚本?

  • 如何将必须从其自己的目录中运行的程序添加到面板或主菜单?

  • 如何编写 shell 脚本来安装应用程序列表?

  • Mac OS X Automator 的替代品?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve