Как разбить строки разрыва с помощью скриптов Bash? - PullRequest
0 голосов
/ 12 мая 2019

Если у вас есть строка с разделителем, скажем, символом ,, вы можете использовать IFS просто так:

text=some,comma,separated,text
IFS="," read -ra ADDR <<< "$text"

for i in ${ADDR[@]}
do
    echo $i
done

Каждое слово будет напечатано в новой строке. Но если вы возьмете результат команды, такой как ls, а затем попытаетесь разделить его на \n, вы не получите тот же результат:

results=$(ls -la)
IFS="\n" read -ra ADDR <<< "$results"

for i in ${ADDR[@]}
do
    echo $i
done

Он печатает только 2 строки, и они даже не являются записями файла. Это

total
36

Первая строка вывода команды ls.

Может кто-нибудь оказать небольшую помощь? Если это не правильный путь, как это?

Ответы [ 3 ]

1 голос
/ 12 мая 2019

Используйте readarray или mapfile, чтобы прочитать много строк в массив.Гораздо прощеУбедитесь, что в цикле также указаны расширения переменных.

results=$(ls -la)
readarray -t ADDR <<< "$results"

for i in "${ADDR[@]}"
do
    echo "$i"
done

Или пропустите переменную $results:

readarray -t ADDR < <(ls -la)
1 голос
/ 12 мая 2019

read обычно читает, пока не достигнет новой строки, если вы не укажете это иначе, используя -d.

В этом примере мы используем -d $'\0'.Оболочка считывается до тех пор, пока не достигнет нулевого символа (чего не будет при выводе ls).Затем IFS=$'\n' заставляет оболочку разделяться на новую строку и назначать каждую строку как элемент массива.Обратите внимание на использование $'...' вместо "..." для интерпретации escape-последовательностей.

results=$(ls -la)

IFS=$'\n' read -ra ADDR -d $'\0' <<< "$results"

for i in "${ADDR[@]}"
do
    echo "$i"
done

Последнее, но не менее важное, мы должны заключить в кавычки как замены массива, так и $i.

0 голосов
/ 12 мая 2019

Я не уверен, какой вывод вы ищете, но предположил, что вы ищете каждую строку, разбитую на токены. Вот один из способов:

/bin/ls -la | while read -ra line
do
    # Whole line
    echo "Line: >${line[@]}<"

    # Break each line into tokens
    for i in ${line[@]}
    do
        echo "- $i"
    done
done

Примечания * * 1004 Первая строка принимает вывод ls -la и передает в цикл while, читая каждую строку как массив Внутри цикла while мы можем работать со строкой в ​​целом или с отдельными токенами Выходная выдержка

Line: >-rw-r--r-- 1 haiv staff 142 May 8 10:56 star.md<
- -rw-r--r--
- 1
- haiv
- staff
- 142
- May
- 8
- 10:56
- star.md
Line: >drwxr-xr-x 7 haiv staff 224 May 2 10:26 tailstring<
- drwxr-xr-x
- 7
- haiv
- staff
- 224
- May
- 2
- 10:26
- tailstring
...