Parênteses simples na atribuição de variável bash

11

Eu queria saber sobre parênteses únicos no bash. Eu sei que eles são usados ​​para executar comandos em subshells e que eles são usados ​​para criar matrizes, mas eles são usados ​​para qualquer outra coisa?

Uma coisa que chamou minha atenção é que, quando você usa a atribuição de variável, como

var=(hello)
echo $var    # hello

bash não gera um erro ou algo assim, e a saída é a mesma que se

var=hello

Essas duas definições de variáveis ​​são iguais ou há alguma diferença?

Mattias
fonte

Respostas:

14

No seu caso, parênteses ()são usados ​​como definição de matriz, por exemplo

a=(one two three)   # array definition
echo "${a}"         # print first element of array a
echo "${a[0]}"      # print first element of array a
echo "${a[1]}"      # print *second* element of array a
echo "${#a[@]}"     # print number of elements in array a

Se você colocar uma variável única na matriz, você terá apenas uma matriz com um único elemento.


Para responder à sua outra pergunta, se parênteses também são usados ​​para qualquer outra coisa: existem muitas situações em bashque, em combinação com outros caracteres, eles podem ser usados ​​como:

  • substituição de comando: $()
  • substituição de processo: <()e>()
  • subshell: (command)
  • avaliação aritmética: (())
  • definição de função: fun () { echo x; }
  • lista de padrões no glob: ?(), *(), +(), @(), !()( apenas se extglobestiver activada )
jimmij
fonte
1
Certo, eu realmente não pensei nisso. Mas assim var=(1 2 3); echo $varé o mesmo que var=(1 2 3); echo ${var[0]}?
Mattias
Sim, o resultado bashé o mesmo.
jimmij
Precisamos ""entrar echo "${a}"?
nn0p 10/02/19
@ nn0p Sim, sim, se não queremos executar operações de divisão e glob a. Considere, por exemplo a=*, tente echo $ae echo "$a".
jimmij