Você pode atribuir valores a variáveis (com var=value
). Existe uma distinção perfeita entre um parâmetro e um variável :
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.
name 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.
(Essa é a definição no manual do Bash, POSIX provavelmente tem algo similar.)
Portanto, qualquer coisa que corresponda ao regex [a-zA-Z_][a-zA-Z_0-9]*
(assumindo intervalos de caracteres ASCII) é um nome válido para uma variável. Caracteres Unicode e pontuação não funcionam.
Esse é basicamente o conjunto de caracteres suportados em nomes de variáveis na maioria das linguagens de programação, embora alguns também suportem Unicode. As palavras que começam com dígitos são tomadas como números (note que coisas como 0xabcd
e 123e3
são frequentemente números válidos), e o traço é geralmente considerado como o operador menos, então a-b
é uma operação aritmética simples de duas variáveis, não uma variável. E assim por diante.
Os parâmetros que não são desse formato são os parâmetros posicionais numerados (argumentos de script / função, atribuíveis com set
) e o parâmetros especiais . Observe que _
(um único sublinhado) é um dos últimos e, embora você possa atribuir a ele sem um erro, não é muito útil, pois é redefinido imediatamente.
Estes são bons:
$ a123=foo __=bar
$ echo $a123 $__
foo bar
mas:
$ _=foo echo bar >/dev/null
$ echo $_
bar
Quanto aos maiúsculos, há uma lista das variáveis que são especiais para Bash ou outros shells Bourne-ish (ignore as variáveis readline, eles não estão relacionados aqui). Todos parecem começar com uma letra maiúscula, exceto que há histchars
em letras minúsculas (!). Felizmente, só importa se a expansão do histórico estiver ativada.