Поиск…


параметры

параметр подробности
IFS Внутренний разделитель полей
файл Имя файла / путь
-r Запрещает интерпретацию обратной косой черты при использовании с чтением
-t Удаляет readarray новую строку из каждой строки, считанной readarray
-d DELIM Продолжайте, пока не будет прочитан первый символ DELIM (с read ), а не символ новой строки

Считывает файл (/ etc / passwd) по строкам и по полям

#!/bin/bash
FILENAME="/etc/passwd"
while IFS=: read -r username password userid groupid comment homedir cmdshell
do
  echo "$username, $userid, $comment $homedir"
done < $FILENAME

В файле unix password информация пользователя хранится по очереди, каждая строка состоит из информации для пользователя, разделенного символом двоеточия (:). В этом примере при чтении файла строки за строкой строка также разделяется на поля с использованием символа двоеточия в качестве разделителя, который обозначается значением, заданным для IFS.

Пример ввода

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

Образец вывода

mysql, 27, MySQL Server /var/lib/mysql
pulse, 497, PulseAudio System Daemon /var/run/pulse
sshd, 74, Privilege-separated SSH /var/empty/sshd
tomcat, 91, Apache Tomcat /usr/share/tomcat6
webalizer, 67, Webalizer /var/www/usage

Чтобы читать строки за строкой и иметь всю строку, назначенную переменной, ниже приведена модифицированная версия примера. Обратите внимание, что у нас есть только одна переменная по названию.

#!/bin/bash
FILENAME="/etc/passwd"
while IFS= read -r line
do
  echo "$line"
done < $FILENAME

Пример ввода

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

Образец вывода

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

Чтение строк файла в массив

readarray -t arr <file

Или с петлей:

arr=()
while IFS= read -r line; do
   arr+=("$line")
done <file

Зацикливание через файл по строкам

while IFS= read -r line; do
   echo "$line"
done <file

Если файл не может содержать новую строку в конце, тогда:

while IFS= read -r line || [ -n "$line" ]; do
   echo "$line"
done <file

Чтение строк строки в массив

var='line 1
line 2
line3'
readarray -t arr <<< "$var"

или с петлей:

arr=()
while IFS= read -r line; do
   arr+=("$line")
done <<< "$var"

Зацикливание строк по строкам

var='line 1
line 2
line3'
while IFS= read -r line; do
   echo "-$line-"
done <<< "$var"

или же

readarray -t arr <<< "$var"
for i in "${arr[@]}";do
    echo "-$i-"
done

Зацикливание через вывод командной строки за строкой

while IFS= read -r line;do
    echo "**$line**"
done < <(ping google.com)

или с трубой:

ping google.com |
while IFS= read -r line;do
    echo "**$line**"
done

Чтение поля файла по полю

Предположим, что разделитель полей : (двоеточие) в файле файла .

while IFS= read -d : -r field || [ -n "$field" ]; do
   echo "$field"
done <file

Для контента:

first : se
con
d:
    Thi rd:
    Fourth

Выход:

**first **
** se
con
d**
**
    Thi rd**
**
    Fourth
**

Чтение поля строки по полю

Предположим, что разделитель полей :

var='line: 1
line: 2
line3'
while IFS= read -d : -r field || [ -n "$field" ]; do
   echo "-$field-"
done <<< "$var"

Выход:

-line-
- 1
line-
- 2
line3
-

Чтение полей файла в массиве

Предположим, что разделитель полей :

arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
   arr+=("$field")
done <file

Чтение полей строки в массив

Предположим, что разделитель полей :

var='1:2:3:4:
newline'
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
   arr+=("$field")
done <<< "$var"
echo "${arr[4]}"

Выход:

newline

Зацикливание через вывод поля команды по полю

Предположим, что разделитель полей :

while IFS= read -d : -r field || [ -n "$field" ];do
    echo "**$field**"
done < <(ping google.com)

Или с трубой:

ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
    echo "**$field**"
done


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow