2016-08-16 2 views
0

Сценарий оболочки bash может разбивать заданную строку по пространству на 1D-массив.Скрипт оболочки разделяет строку пробелом

str="a b c d e" 
arr=($str) 

# arr[0] is a, arr[1] is b, etc. arr is now an array, but what is the magic behind? 

Но что именно произошло, когда мы можем arr=($str)? Мое понимание в скобках здесь создает подоболочку, но что же происходит после этого?

+0

Как вы хотите обратные косые быть обработаны? Если у вас есть 'a \ b c d e', должен ли первый элемент быть' a b' или '' 'a \' ''? –

ответ

2

В задании скобки просто указывают, что создается массив; это не зависит от использования круглых скобок в качестве составной команды.

Это не рекомендуемый способ разделить строку. Предположим, у вас есть строка

str="a * b" 
arr=($str) 

Когда $str расширяется, значение претерпевает как софистика (что позволяет массиву иметь несколько элементов), а также расширение имени пути. Теперь ваш массив будет иметь a как его первый элемент, b как последний элемент, но один или несколько элементов между ними, в зависимости от того, сколько файлов в текущей работе напрямую связано с *. Лучшим решением является использование команды read.

read -ra arr <<< "$str" 

read Теперь сама команда разбивает значение $str без применения и расширения имени пути к результату.

+0

Является ли '<<<' специальной операцией для 'read'? – Jes

+2

Это не относится к 'read'; это специальный оператор перенаправления. 'read' берет свой вход со стандартного ввода. В то время как 'read chepner

+0

Может потребоваться 'read -r -a', если OP явно не хочет, чтобы обратная косая черта влияла на группировку. –

0

Кажется, вы запутанную

arr=($str) # An array is created with word-splitted str 

с

(some command) # executing some command in a subshell 

Обратите внимание, что

arr=($str) отличается от arr=("$str") в том, что в последнем, двойные кавычки предотвращает слово расщепление, т.е. массив будет содержать только одно значение ->a b c d e.

Вы можете проверить разницу между двумя приведенными ниже

echo "${#arr[@]}" 
Смежные вопросы