Одиночная скобка в присваивании переменной bash

11

Мне было интересно об одиночных скобках в bash. Я знаю, что они используются для выполнения команд в подоболочках и что они используются для создания массивов, но используются ли они для чего-то еще?

Одна вещь, которая привлекла мое внимание, заключается в том, что когда вы используете

var=(hello)
echo $var    # hello

Bash не генерирует ошибку или что-то, и вывод такой же, как если бы

var=hello

Являются ли эти два определения переменных одинаковыми или есть разница?

Маттиас
источник

Ответы:

14

В вашем случае скобки ()используются в качестве определения массива, например

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

Если вы поместите одну переменную в массив, то у вас просто будет массив с одним элементом.


Чтобы ответить на ваш другой вопрос, используются ли круглые скобки для чего-либо еще: во многих ситуациях bashв сочетании с другими символами их можно использовать как:

  • подстановка команд: $()
  • процесс замены: <()и>()
  • подоболочка: (command)
  • арифметическая оценка: (())
  • определение функции: fun () { echo x; }
  • Список шаблон в Glob: ?(), *(), +(), @(), !()( только если extglobесть включить )
jimmij
источник
1
Да, я на самом деле не думал об этом. Но так var=(1 2 3); echo $varже, как var=(1 2 3); echo ${var[0]}?
Маттиас
Да, результат в bashтом же.
Джимми
Нужно ли нам ""в echo "${a}"?
nn0p
@ nn0p Да, если мы не хотим выполнять операции разбиения и выделения a. Рассмотрим для примера a=*, затем попробуйте echo $aи echo "$a".
Джимми