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 aname
.
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 anidentifier
.
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