В bash, я бы хотел чтобы преобразовать переменную среды, подобную PATH, которая может содержать элементы, разделенные пробелами, в array
, убедившись, что элементы, несущие пробелы, не вызывают расщепления слов, появляясь как "несколько элементов".
Пусть PATH_VARIABLE
- рассматриваемая переменная.
Пусть un:dodecaedro:per:tirare:per:i danni
- содержимое переменной.
Это предназначено для желаемого array
_ для элементов 6
, а не 7
.
0) un
1) dodecaedro
2) per
3) tirare
4) per
5) i danni
"Трудная" запись может быть разделенной пробелом: i danni
.
Я ищу абсолютно оптимальный и правильный способ достижения этого.
Ограничение: оно должно работать с моим bash версия: v3.2.48(1)-release
В python это делается просто красиво так:
>>> v='un:dodecaedro:per:tirare:per:i danni'
>>> len(v.split(':'))
6
Работает. Показывает то, что я ищу.
Какой лучший способ сделать это в нашей любимой bash?
Можете ли вы конкретно улучшить мою попытку 4
?
Здесь мои попытки
#!/bin/bash
PATH_VARIABLE='un:dodecaedro:per:tirare:per:i danni'
# WRONG
a1=($(echo $PATH_VARIABLE | tr ':' '\n'))
# WRONG
a2=($(
while read path_component; do
echo "$path_component"
done < <(echo "$PATH_VARIABLE" | tr ':' '\n')
))
# WORKS, it is elegant.. but I have no bash 4!
# readarray -t a3 < <(echo "$PATH_VARIABLE" | tr ':' '\n')
# WORKS, but it looks "clunky" to me :(
i=0
while read line; do
a4[i++]=$line
done < <(echo "$PATH_VARIABLE" | tr ':' '\n')
n=${#a4[@]}
for ((i=0; i < n; i++)); do
printf '%2d) %s\n' "$i" "${a4[i]}"
done
Моя среда
bash v3.2.48 (1 ) -release
osx OS X v10.8.3 (построить 12D78)