AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 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

A recomendação Shellcheck para a variável de aspas duplas não funciona ao cortar a tubulação

  • 772

Estou fazendo um script para imprimir as informações do sistema de arquivos ZFS - atualmente em fase de teste, e estou recebendo um erro estranho.

A parte relevante do meu script inicial é esta:

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"

Dando a seguinte saída:

zfs                      2.31M  5.27T     34.4K  /mnt/zfs
zfs                      5.3T  128K  5.3T   1% /mnt/zfs
2.31M
5.3T

No entanto, quando executo shellcheck, ele diz que devo colocar aspas duplas nos nomes das variáveis ​​dentro da substituição do comando, esta é a saída de 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)"

Então, é claro, mudo meu código para a recomendação do 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"

Mas agora a saída é esta:

zfs                      2.31M  5.27T     34.4K  /mnt/zfs
zfs                      5.3T  128K  5.3T   1% /mnt/zfs
 
 

As linhas 3 e 4 estão em branco, o que significa que a substituição do 3º e 4º comando não funciona ao seguir a recomendação do shellcheck, mas funciona quando não estou citando a variável que eu echo.

Estou usando o Bash 5.0.17 no Ubuntu 20.04.1

Alguém pode explicar isso por favor??? Obrigado.

scripts bash pipe syntax
  • 2 2 respostas
  • 465 Views

2 respostas

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

    Adicionar -Ha zfs removerá os cabeçalhos e os campos separados por uma única guia em vez de espaços em branco arbitrários, o que simplifica consideravelmente a análise. Porque dfnão tem uma opção para remover o cabeçalho,findmnt será uma escolha melhor.

    #!/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"
    

    Não há tamanho total, pois dfassim, você precisa recorrer à matemática tradicional.

    #!/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

    De acordo com a sugestão do @steeldrivers, substituí cutpor awk, e isso funciona conforme o esperado.

    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"
    

    Por consistência, acredito que esta seja a melhor solução para preservar a sintaxe recomendada por shellcheck, usando consistentemente awkover cutpara divisão de strings, a menos que haja um motivo específico para usarcut .

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve