Os linux for read

Команда read в Bash

Bash поставляется с рядом встроенных команд, которые можно использовать в командной строке или в сценариях оболочки.

В этой статье мы рассмотрим встроенную команду read .

Встроенное read Bash

read — это встроенная команда bash, которая считывает строку из стандартного ввода (или из файлового дескриптора) и разбивает строку на слова. Первое слово присваивается первому имени, второе — второму имени и так далее.

Общий синтаксис встроенной функции read имеет следующий вид:

Чтобы проиллюстрировать, как работает команда, откройте терминал, введите read var1 var2 и нажмите «Enter». Команда будет ждать, пока пользователь введет данные. Введите два слова и нажмите «Enter».

read var1 var2Hello, World!

Слова присваиваются именам, которые передаются команде read качестве аргументов. Используйте echo или printf чтобы проверить это:

Вместо того, чтобы вводить текст на терминале, вы можете передать стандартный ввод для read с помощью других методов, таких как piping, here-string или heredoc :

echo "Hello, World!" | (read var1 var2; echo -e "$var1 n$var2")

Вот пример использования строки здесь и printf :

read -r var1 var2 printf "var1: %s nvar2: %sn" "$var1" "$var2"

Если команде read не задан аргумент, вся строка присваивается переменной REPLY :

echo "Hello, world!" | (read; echo "$REPLY")

Если количество аргументов, предоставленных для read , больше, чем количество слов, прочитанных из ввода, оставшиеся слова присваиваются фамилии:

echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 nVar2: $var2")
Var1: Linux Var2: is awesome. 

В противном случае, если количество аргументов меньше количества имен, оставшимся именам присваивается пустое значение:

echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 nVar2: $var2 nVar3: $var3")
Var1: Hello, Var2: World! Var3: 

По умолчанию read интерпретирует обратную косую черту как escape-символ, что иногда может вызывать неожиданное поведение. Чтобы отключить экранирование обратной косой черты, вызовите команду с параметром -r .

Ниже приведен пример, показывающий, как работает read при вызове с параметром -r и без него:

Как правило, вы всегда должны использовать read с параметром -r .

Изменение разделителя

По умолчанию при read строка разбивается на слова с использованием одного или нескольких пробелов, табуляции и новой строки в качестве разделителей. Чтобы использовать другой символ в качестве разделителя, присвойте его переменной IFS (внутренний разделитель полей).

echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 n$var2 n$var3")

Когда IFS установлен на символ, отличный от пробела или табуляции, слова разделяются ровно одним символом:

echo "Linux::is:awesome." | (IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 nVar2: $var2 nVar3: $var3 nVar4: $var4")

Строка разделена четырьмя словами. Второе слово — это пустое значение, представляющее отрезок между разделителями. Он создан, потому что мы использовали два символа-разделителя рядом друг с другом ( :: .

Var1: Linux Var2: Var3: is Var4: awesome. 

Для разделения строки можно использовать несколько разделителей. При указании нескольких разделителей присваивайте символы переменной IFS без пробела между ними.

Вот пример использования _ и - качестве разделителей:

echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 n$var2 n$var3")

Строка подсказки

При написании интерактивных сценариев bash вы можете использовать команду read для получения пользовательского ввода.

Чтобы указать строку приглашения, используйте параметр -p . Подсказка печатается перед выполнением read и не включает новую строку.

Как правило, вы будете использовать для read команды внутри в while цикл , чтобы заставить пользователя дать один из ожидаемых ответов.

Приведенный ниже код предложит пользователю перезагрузить систему :

while true; do read -r -p "Do you wish to reboot the system? (Y/N): " answer case $answer in [Yy]* ) reboot; break;; [Nn]* ) exit;; * ) echo "Please answer Y or N.";; esac done 

Если сценарий оболочки просит пользователей ввести конфиденциальную информацию, например пароль, используйте параметр -s который сообщает read не печатать ввод на терминале:

read -r -s -p "Enter your password: " 

Назначьте слова в массив

Чтобы присвоить слова массиву вместо имен переменных, вызовите команду read с параметром -a :

read -r -a MY_ARR  "Linux is awesome." for i in "$MY_ARR[@]>"; do echo "$i" done 

Когда даны и массив, и имя переменной, все слова присваиваются массиву.

Выводы

Команда read используется для разделения строки ввода на слова.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Linux read file line by line: for loop

Linux read file line by line: for loop

This article will introduce the concept of playing a file line by line in Linux with the help of examples and best user tips. We'll walk you through some of the most common errors made when reading a file on the Linux platform, and show you examples of how the for loop and while loop outputs differ. We'll also provide you with some tips and examples on how to initiate a loop, and how to use the while loop output.

Common errors with for loops

One of the most common errors when using scripts bash on GNU/Linux is to read a file line by line by using a for loop (for line in $ (cat file.txt) do. ..). In this example, the for loop leads to an assessment for each line, rather than as assessment of every word in the file.

It is possible to change the value of the variable $ IFS (Internal Field Separator, internal field separator) with a for loop before starting the loop.

Here is a sample output with a for loop:

for line in $ (cat file.txt) do echo "$ line" done

This is row No 1 This is row No 2 This [. ]

The solution is to use a while loop coupled with the internal read.

It is also possible to get the result with a for loop, provided you change the value of the variable $ IFS (Internal Field Separator, internal field separator) before starting the loop.

While Loop example

The while loop remains the most appropriate and easiest way to read a file line by line.

while read line do command done 

For Loop example

The instructions in the command line: 
while read line; do echo -e "$line\n"; done < file.txt
#! / bin / bash while read line do echo-e "$ line \ n" done This is line 1 This is line 2 This is line 3 This is line 4 This is line 5 

Tips for For Loops

From a structured file (such as an address book or /etc/passwd), it is entirely possible to retrieve the values of each field and assign them to several variables with the command 'read'. Be careful to properly assign the IFS variable with good field separators (space by default). Example: 
#! /bin/bash while IFS=: read user pass uid gid full home shell do echo -e "$full :\n\ Pseudo : $user\n\ UID :\t $uid\n\ GID :\t $gid\n\ Home :\t $home\n\ Shell :\t $shell\n\n" done < /etc/passwd

Bonus

while read i; do echo -e "Parameter : $i"; done < <(echo -e "a\nab\nc")

How to initiate a Loop

Although the while loop remains the easiest method for reading a file line by line, it does have its side effects. The while loop will obliterate the formatting of lines, including spaces and tabs. Furthermore, the for loop coupled with a change of IFS helps keep the structure of the document output. Syntax:
old_IFS=$IFS # save the field separator IFS=$'\n' # new field separator, the end of line for line in $(cat fichier) do command done IFS=$old_IFS # restore default field separator

Источник

Читайте также:  Настройка wifi адаптера kali linux
Оцените статью
Adblock
detector