У меня есть переменная, которая содержит разделенную пробелами строку:
line="1 1.50 string"
Я хочу разделить эту строку пробелом в качестве разделителя и сохранить результат в массиве, так что следующее:
echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}
выходы
1
1.50
string
Где-то я нашел решение, которое не работает:
arr=$(echo ${line})
Если после этого я выполню приведенные выше операторы echo, я получу:
1 1.50 string
[empty line]
[empty line]
Я тоже пробовал
IFS=" "
arr=$(echo ${line})
с тем же результатом. Может кто-нибудь помочь, пожалуйста?
set -f; arr=($string); set +f
кажется быстрее чемread -r -a <<< $string
.Ответы:
Чтобы преобразовать строку в массив, используйте
или
Крайне важно не использовать кавычки, так как это делает свое дело.
источник
for i in ${arr[@]}; do echo $i; done
echo ${arr[@]}
$line
есть символы-заглушки.mkdir x && cd x && touch A B C && line="*" arr=($line); echo ${#arr[@]}
дает 3declare -a "arr=($line)"
будет игнорироватьIFS
разделители внутри указанных строкline='*'
,read -a arr <<<$line
всегда работает, но толькоarr=($line)
терпит неудачу.Попробуй это:
источник
line='*'
В:
arr=( $line )
. «Раскол» связан с «шаром».Подстановочные знаки (
*
,?
и[]
) будут расширены до соответствующих имен файлов.Правильное решение немного сложнее:
Нет проблем с глобализацией; разделенный символ установлен
$IFS
, переменные указаны.источник
arr=($line)
в принятом ответе страдает от глобальных проблем. Например, попробуйте:line="twinkling *"; arr=($line); declare -p arr
.<<<
но может быть хорошей идеей использовать двойные кавычки для согласованности и читабельности.Если вам нужно расширение параметров, попробуйте:
Например, возьмите следующий код.
Если текущий каталог содержит файлы
a.txt
,b.txt
иc.txt
, то выполнение кода приведет к следующему выводу.источник
источник
tr
них лишняя, но"${arr[@]}"
вместо этого она должна зацикливаться, а не$arr