Как сохранить элементы из линии в массив? - PullRequest
0 голосов
/ 27 января 2019

В настоящее время я работаю над проектом, и у меня есть эти переменные:

line=1    2    3    4
line2=5    6    7    8

Моя цель - написать цикл for, который анализирует каждую «строку» и последовательно сохраняет каждый элемент в массиве. Вот что я написал до сих пор:

arr=()
arr2=()

for i in $line1
do
    arr+=($i)
done

for j in $line2
do
    arr2+=($j)
done

Таким образом, теоретически, в этот момент arr2 и arr2 должны содержать {1,2,3,4} и {5,6,7,8} соответственно. Далее я написал следующее для отображения массива:

echo "Displaying Array:"

echo "Arr:"
for k in "${arr[@]}"
do
    echo ${arr[k]}
done

echo "Arr2:"
for l in "${arr2[@]}"
do
    echo ${arr2[l]}
done

Когда я запускаю это, я получаю следующий вывод:

Displaying Array:

Arr:
2
3
4

Arr2:

Я так запутался в этом ... почему "1" не появляется в Arr? И почему у меня четыре пустых места в Arr2? Любая помощь приветствуется. Спасибо!

1 Ответ

0 голосов
/ 27 января 2019

Зачем вообще цикл?

arr=( $(echo $line) )
arr2=( $(echo $line2) )

Выполнено

Краткий пример:

#!/bin/bash

line="1    2    3    4"
line2="5    6    7    8"

arr=( $(echo $line) )
arr2=( $(echo $line2) )

declare -p arr
declare -p arr2

выход

$ bash line2arr.sh
declare -a arr='([0]="1" [1]="2" [2]="3" [3]="4")'
declare -a arr2='([0]="5" [1]="6" [2]="7" [3]="8")'

Если вход включает в себя буквальное {1,2,3,4}

Если ваша переменная содержит литерал {1,2,3,4}, то вы можете просто включить '{},' в IFS ( Внутренний разделитель полей - по умолчанию ' \t\n' (пробел, табуляция, символ новой строки)), и затем преобразуйте строку в массив таким же образом, например,

#!/bin/bash

line="1    2    3    4"
line2="5    6    7    8"
line3={1,2,3,4}

arr=( $(echo $line) )
arr2=( $(echo $line2) )

oifs="$IFS"             ## save old IFS
IFS=$'{}, \t\n'         ## set IFS to include {},
arr3=( $(echo $line3) ) ## convert to array
IFS="$oifs"             ## restore original IFS

declare -p arr
declare -p arr2
declare -p arr3

выход

$ bash line2arr.sh
declare -a arr='([0]="1" [1]="2" [2]="3" [3]="4")'
declare -a arr2='([0]="5" [1]="6" [2]="7" [3]="8")'
declare -a arr3='([0]="1" [1]="2" [2]="3" [3]="4")'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...