Faz o trabalho -v em parâmetros posicionais?

1

Do manual bash

-v varname

True if the shell variable varname is set (has been assigned a value).

Eu testo se o parâmetro posicional 1 está definido por -v 1 em um script bash, mas ele não permite que o teste seja aprovado quando eu forneço um argumento de linha de comando. Eu me pergunto por quê?

#! /bin/bash

if [ -v 1 ]; then
    echo "1 exists"
fi

Obrigado.

    
por Tim 27.01.2018 / 17:44

1 resposta

3

Você está certo, parece que não funciona:

$ bash -c 'set -- aa bb; [ -v 1 ] && echo y || echo n'
n

Pode haver uma diferença de separação entre variáveis e parâmetros .

O manual de referência do Bash os define assim :

A parameter is an entity that stores values. It can be a name, a number, or one of the special characters listed below. A variable is a parameter denoted by a name.

E um name é definido como

A word consisting solely of letters, numbers, and underscores, and beginning with a letter or underscore. Names are used as shell variable and function names. Also referred to as an identifier.

Portanto, todas as variáveis são parâmetros, mas nem todos os parâmetros são variáveis. E test -vvarname retorna

True if the shell variable varname is set

1 não é um nome e $1 não é uma variável, por isso test -v não funciona. Mas podemos usar a expansão de parâmetro e [ ${1+x} ] ou algo assim para $1 e qualquer outro parâmetro (incluindo qualquer variáveis .)

$ bash -c 'set -- aa bb; [ ${1+x} ] && echo y || echo n'
y
    
por 27.01.2018 / 18:04

Tags