Поведение задания массива

В Bash массивы a=( 11 22 ) и b=$(echo "11 22") ведут себя по-разному при печати.

 $ a=( 11 22 ) $ b=$(echo "11 22") $ echo $b 11 22 $ echo $a 11 

Если мы хотим напечатать полное содержимое, мы должны прибегнуть к его печати как ${a[*]} , в отличие от $a .

Что объясняет эту разницу в поведении между назначением массива по скобкам и одним путем подстановки команды?

2 Solutions collect form web for “Поведение задания массива”

Для массива (скажем, arr ), просто ссылаясь на массив, используя стандартную нотацию ссылки $arr , аналогично ${arr[0]} то есть это относится к первому элементу массива. Это то, что происходит в вашем случае.

Если вы хотите ссылаться на все элементы массива, вы почти всегда хотите использовать "${arr[@]}" , а не "${arr[*]}" . Поскольку в последнем случае при цитировании такого типа элементы будут отображаться как одна строка с первым символом IFS качестве разделителя, по умолчанию (когда IFS – это пробел, табуляция, новая строка ), пространство становится разделителем.

В случае, когда ${arr[@]} имеет кавычек, он расширяется до всех элементов массива с разбиением слова и расширением пути.

Вот вам пример:

 $ a=( 11 22 ) $ printf '%s\n' "$a" 11 $ printf '%s\n' "${a[0]}" 11 printf '%s\n' "${a[*]}" 11 22 $ printf '%s\n' "${a[@]}" 11 22 

Теперь, в случае b=$(echo "11 22") , вы просто выполняете подстановку команд и внутри этого запускающего echo "11 12" (в подоболочке), и результат сохраняется на переменной b , а это не массив . Следовательно, вы получаете 11 12 при echo сигнале $b .

Обратите внимание, что правая часть присваивания переменной не проходит через разделение слов, поэтому строка 11 12 сохраняется в переменной b даже если между ними есть пробел.

Спасибо за приведенную ниже заметку от @cas:
$ b не является массивом, это строка, содержащая «11 22»,

Эквивалент

 a=( 11 22 ) 

Является

 b=($(echo "11 22")) 

В результате

 $ a=( 11 22 ) $ b=($(echo "11 22")) $ echo $a 11 $ echo ${a[*]} 11 22 $ echo $b 11 $ echo ${b[*]} 11 22 
  • Невозможно выполнить сценарий Bash, если / while
  • bash - определяющие переменные с VAR = $ {: - по умолчанию}
  • Функция проверки переменной BASH
  • шаблон awk с переменной в скрипте bash
  • Использование sed в сценарии оболочки с многострочными переменными
  • Как использовать расширенное значение переменной оболочки в имени другой переменной?
  • Назначить имя хоста переменной в ksh
  • dirname и basename против расширения параметров
  • Отложить переменное расширение до подоболочки
  • Расширение «$ @» для пользовательских переменных
  • Невозможно назначить вывод вложенных команд переменной в bash
  • Linux и Unix - лучшая ОС в мире.