Como eu verifico se uma variável foi passada para uma função no Bash?

2

Eu tenho isso:

function abash {
    if [[ -v $1 ]]
        then
            atom ~/Shell/$1.sh
        else
            atom ~/.bashrc
    fi
}

no meu arquivo ~/.bashrc , para facilitar o uso do Atom para editar meus scripts bash, agora o problema é que [[ -v $1 ]] foi feito para verificar se a entrada $1 existe, mas não aparece para ser, como até mesmo quando eu fornecer uma entrada válida (por exemplo, executando abash cd onde ~/Shell/cd.sh é um arquivo que eu quero editar) abash abre ~/.bashrc . Como faço para corrigir esse problema? De onde obtive a ideia do teste [[ -v $1]] ? Esta resposta.

    
por Brenton Horne 28.10.2015 / 05:41

3 respostas

3
bash expressão condicional -v var verificar se variável do shell denominada var está definida.

Ao usar [[ -v $1 ]] , você realmente verificou se uma variável nomeada pelo conteúdo de $1 foi definida. No seu exemplo, isso significa $cd , que nunca foi definido.

Você pode simplesmente verificar se $1 é uma string não vazia, usando -n :

function abash {
    if [[ -n "$1" ]]
        then
            atom ~/Shell/"$1.sh"
        else
            atom ~/.bashrc
    fi
}

Observe que var deve ser uma variável do shell para -v var work. [[ -v 1 ]] nunca funcionará porque 1 é indicado para parâmetro posicional .

    
por 28.10.2015 / 05:51
4

Não sei por que isso falha, mas há (pelo menos) duas outras opções possíveis. Em vez de [[ -v $1 ]] , você poderia usar uma das seguintes opções.

Verifique se o número de argumentos é maior que zero.

[[ $# > 0 ]]

Verifique se o primeiro argumento não está vazio.

[[ $1 != '' ]]
    
por 28.10.2015 / 05:55
1

O que precisa estar no teste é o nome do var, um nome de tag, se você desejar. Para testar a variável a, você faz não do '[[-v $ a]], você faz:

[[ -v a ]]

No entanto, não há como (AFAIK) testar parâmetros posicionais com -v porque, em essência, os parâmetros posicionais não têm nome. Ou, se desejar, eles são números e o teste não funciona com um número.

Então, você precisa testar o var diretamente sem a ajuda de -v desta forma:

[[ ${1:+present} ]]

Além disso:

Você deve citar suas expansões var.
Eu prefiro usar $ HOME, em vez do til. Permite strings citadas.

abash() {
    if [[ ${1:+present} ]]
        then
            atom "$HOME/Shell/$1.sh"
        else
            atom "$HOME/.bashrc"
    fi
}

A resposta é semelhante a esta , mas anote o : que incluí para que funcione corretamente .

    
por 28.10.2015 / 09:10