Bash lança erro, linha 8: $ 1: variável não vinculada

1

Eu me sinto muito estúpida, mas estou tentando aprender a usar o getopts para que eu possa ter scripts com entrada analisada (embora eu ache que o getopts poderia ser melhor). Eu estou tentando apenas escrever um script simples para retornar porcentagens de uso da partição. O problema é que uma das minhas funções bash não parece gostar que eu faça referência a $1 como uma variável dentro da função. A razão pela qual eu faço referência a $1 é porque a função get_percent pode receber um ponto de montagem como um argumento opcional para exibir em vez de todos os pontos de montagem.

O script

#!/usr/bin/bash

set -e
set -u
set -o pipefail

get_percent(){
    if [ -n "$1" ] 
    then
        df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
    else
        df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
    fi
}

usage(){
    echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2
}

# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
    get_percent
    exit 0
fi
# ...

A saída

$ bash thing.sh
thing.sh: line 8: $1: unbound variable

$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable
    
por Timothy Pulliam 16.08.2018 / 20:00

3 respostas

8

set -u será abortado exatamente como você descreve se você referenciar uma variável que não tenha sido definida. Você está invocando seu script sem argumentos, portanto, get_percent está sendo invocado sem argumentos, fazendo com que $1 seja cancelado.

Verifique isso antes de invocar sua função ou use expansões padrão ( ${1-default} expandirá para default , se ainda não estiver definido para outra coisa).

    
por 16.08.2018 / 20:04
0

Este é o efeito de set -u .

Você pode verificar $# dentro da função e evitar referenciar $1 se ela não estiver definida.

    
por 16.08.2018 / 20:04
0

Como isso é bash , você pode contornar a verificação de $1 sendo definido e usar "$@" (quando estiver entre aspas, esse parâmetro desaparecerá completamente se não tiver valores, o que evita que seja capturado por set -u ):

get_percent() {
    df -h "$@" | awk 'NR>1 { printf "%s\t%s\n", $1, $5 }'
}

Eu também ajustei o resto da linha um pouco para que você não tenha {space} {tab} {space} entre os dois valores que você produziu, mas insista que você tenha apenas uma {tab}. Se você realmente quiser os dois espaços invisíveis, altere o awk para usar printf "%s \t %s\n", $1, $5 .

    
por 16.08.2018 / 20:14