- Команда read
- Работа с «плохими» файлами в командной строке в Linux
- В названии файла есть служебный символ bash
- Имя файла начинается с дефиса
- Удаляем по wildcard
- Файлы с управляющим символом в названии
- Удаление файлов с символами utf8
- Перекодировка имени файла
- Автокомплит
- Удаляем файл через меню выбора
- Удаление по номеру inode
- Удаление по hex-коду
- The read builtin
- Опции
- Examples
- Rudimentary cat replacement
- Press any key.
- Reading Columns
- Simple Split
- Changing The Separator
- Are you sure?
- Ask for a path with a default value
- Команда read в Bash
- Встроенное read Bash
- Изменение разделителя
- Строка подсказки
- Назначьте слова в массив
- Выводы
Команда read
Общая форма этой команды выглядит следующим образом:
Когда выполняется эта команда, оболочка читает строку из стандартного ввода и присваивает первое слово первой переменной, второе слово — второй переменной и т.д. Если же слов в строке оказывается больше, чем переменных, лишние слова присваиваются последней переменной.
- Опция -t позволяет указать timeout в секундах, после которого команда отдаст управление назад в скрипт.
- Опция -s скрывает ввод; это нужно для получения каких-то конфиденциальных данных, например пароля.
- Опция -d указывает символ, при появлении которого чтение ввода нужно завершить; по умолчанию это символ переноса строки.
- Опция -p строка показывает строку приглашения без оконечного перевода строки; обычно с помощью этой опции выводят подсказку, перед тем как команда будет считывать данные.
Если команде не было передано ни одной переменной, то ввод будет сохранен в переменную $REPLY .
Команда read часто используется в цикле while для построчного чтения файла. Команда read возвращает нулевой код завершения до тех пор, пока не обнаружит конец файла. Если данные поступают с терминала, это означает, что пользователь нажал комбинацию клавиш Ctrl+D .
В качестве примера выведем список всех пользователей из файла /etc/passwd :
Ниже приведен пример скрипта, который называется number и является упрощенной версией стандартной команды nl . Он принимает в качестве аргументов один или несколько файлов и отображает их содержимое в отдельно пронумерованных строках. Если же аргументы не заданы, скрипт читает данные из стандартного ввода.
И еще один скрипт, который представляет собой упрощенную версию команды cp :
Источник
Работа с «плохими» файлами в командной строке в Linux
При работе в командной строке администраторы часто сталкиваются с необходимостью что-то сделать с определенным файлом: удалить, переместить, скопировать. При выполнении подобных задач зачастую приходится обращаться к файлам по имени, что может быть затруднительно, поскольку в именах файлов могут встречаться самые разные символы. Даже те, которых нет на клавиатуре. В этом плане работу может облегчить файловый менеджер, в котором файл можно просто выделить и совершить с ним нужное действие. Но для тех, кто привык работать исключительно в командной строке, предлагаются следующие способы.
В качестве shell-оболочки рассмотрим bash, как самую используемую. А в качестве операции над файлами рассмотрим удаление, как самую деструктивную.
Ситуации могут быть разными. В текущей директории могут быть файлы, которые нужно удалить вместе с теми, которые нужно оставить. Имена у них могут быть самыми разными. Причем первые от последних могут отличаться только одним каким-нибудь заковыристым символом.
В названии файла есть служебный символ bash
Самый простой случай. Для удаления файлов, содержащих в своем названии служебные символы вроде пробелов, кавычек, двойных кавычек, звездочек, обратные кавычки и др. можно заэкранировать обратным слешем или использовать одинарные кавычки:
С помощью одинарных кавычек нельзя удалить файл, в названии которого есть одинарная кавычка, даже заэкранировав ее.
С полным списком служебных символов и механизмом экранирования в bash можно ознакомиться в man bash. Раздел QUOTING.
Имя файла начинается с дефиса
Удалить файл, начинающийся с дефиса простым экранированием не получится, и команда rm будет воспринимать дефис, как начало своего аргумента. Решить проблему довольно просто:
Удаляем по wildcard
Если удаление файлов попадает под wildcard-маску, то можно удалить всю группу файлов:
Файлы с управляющим символом в названии
В названии файла может встречаться управляющий ASCII-символ, такой как перевод строки (\n), табуляция (\t), backspace (\b). Это символы с ASCII-кодами менее 0x20, а также символы DELETE и ESC. Для удаления таких файлов подходит конструкция:
Другим способом удаления таких файлов являяется ввод управляющего символа с клавиатуры. Для этого нужно воспользоваться комбинацией клавиш, которая экранирует следующий введенный символ, тем самым запрещая системе обрабатывать его. Как правило, эта комбинация CTRL+V. Точно убедиться в этом можно с помощью команды stty -a, посмотрев на параметр lnext. Удалим файл, содержащий символ ESC:
Удаление файлов с символами utf8
Если имя файла содержит символ в кодировке utf8, который мы не можем набрать на клавиатуре, то удалить такой файл можно выделением его мышкой, копированием в буфер обмена и последующей вставкой на ввод команды rm. Главное условие состоит в том, что наш терминал должен работать в кодировке utf8. Кодировка выставляется в настройках терминала. Будь то xterm, putty или брутальный linux tty.
Перекодировка имени файла
Подозревая, что имя файла находится в кодировке, отличной от кодировки терминала, мы можем выполнить перекодирование всех файлов в текущей директории. В результате файлы с битой кодировкой будут перекодированы, а файлы с ascii-символами изменений не претерпят. Существенный плюс этого способа – приведение всех файлов в читабельный вид.
Как видно, чтобы осуществить правильное перекодирование нужно знать две кодировки: предполагаемую кодировку файла и кодировку нашего терминала. Наиболее трудно распознать предполагаемую кодировку файла по непонятным символам. Есть замечательная табличка
Также можно воспользоваться сторонними программами, которые попытаются распознать кодировку автоматически. Например, онлайн-декодер Лебедева.
Если вы встретили такие символы в примонтированном media-носителе или смонтированном разделе Windows, не спешите ничего перекодировать. Возможно, вы просто указали неправильные опции монтирования.
Автокомплит
В случае, если в директории название требуемого файла начинается уникально, и это название можно однозначно сформировать автокомплитом, то это довольно простой способ удалить файл:
Удаляем файл через меню выбора
Если мы дошли сюда, дело плохо. Попробуем удалить конкретный файл, составив для этого меню выбора. В итоге, все что нам останется сделать – это выбрать нужный пункт меню вместо ввода имени файла. Для этого нам нужно запрограммировать действие, которое будет происходить с файлом или файлами после ввода нами нужных пунктов меню.
Удаление по номеру inode
Удалить файл можно по его номеру inode. Номер inode уникально идентифицирует файл в файловой системе. Узнать номер inode можно с помощью команды ls, а удалить – с помощью find. Недостаток этого способа, такой же, как у предыдущего. Неудобно, в случае большого числа файлов.
Удаление по hex-коду
И нельзя не упомянуть один суровый метод. Удаление по hex-кодам. Суть такова: мы узнаем hex-коды всех байтов в имени файла, а затем удаляем файл, указывая вместо имени hex-коды.
Хорошо, все-таки, что на практике такие файлы попадаются нечасто.
Источник
The read builtin
read something about read here!
Встроенная команда read считывает одну строку данных (текст, пользовательский ввод) из стандартного потока ввода или присоединенного к нему файлового дескриптора в одну или более переменных, которые перечислены как .
Если параметр(ы) дана — строка делится на слова, используя переменную IFS , и каждое слово присваивается как значение переменным в списке параметров . Оставшиеся слова присваиваются последнему параметру если слов больше чем параметров.
Если команде не было определено парамтров вообще, тогда строка полностью считывается(без разделения на слова) и присваивается как значение переменной оболочки REPLY . Тогда REPLY полностью содержит прочитанную строк, лишь с убранными пробелами в начале и в конце.
Опции
Опция | Значние |
---|---|
-a | считывает по слову в массив вместо нормальных переменных. |
-d | распознает вместо символа , для обозначения конца строки. |
-e | для интерактивной оболочки: использует Bash-интерфейс readline для того что бы читать данные |
-i | preloads the input buffer with text from , only works when Readline ( -e ) is used |
-n | число, считывает символов ввода и выходит. |
-N | число, считывает cимволов ввода, игнорируя всякие символы окончания строки и выходит. |
-p |
. Без оконечного перевода строки, Обычно в ней выводят подсказку, перед тем как команда read будет считывать данные.
Конечно будет правильно, задавать элемент массива как имя переменной, без -a :
Пример: вы находитесь в каталоге с файлом, который имеет имя x1 , и вы хотите прочитать его в массив x , с индексом 1
тогда pathname expansion развернет в имя файла x1 и прервет его работу!
Even worse, if nullglob is set, your array/index will disappear.
Чтобы обойти такое поведение — отключите развертывание пути или экранируйте имя массива и индекс:
Examples
Rudimentary cat replacement
A rudimentary replacement for the cat command: read lines of input from a file and print them on the terminal.
Note: Here, read -r and the default REPLY is used, because we want to have the real literal line, without any mangeling. printf is used, because (depending on settings), echo may interpret some baskslash-escapes or switches (like -n ).
Press any key.
Remember the MSDOS pause command? Here’s something similar:
Reading Columns
Simple Split
Read can be used to split a string:
Take care that you cannot use a pipe:
Why? because the commands of the pipe run in subshells that cannot modify the parent shell. As a result, the variables col1 , col2 and col3 of the parent shell are not modified (see article: Bash and the process tree).
If the variable has more fields than there are variables, the last variable get the remaining of the line:
Changing The Separator
By default reads separates the line in fields using spaces or tabs. You can modify this using the special variable IFS, the Internal Field Separator.
Here we use the var=value command syntax to set the environment of read temporarily. We could have set IFS normally, but then we would have to take care to save its value and restore it afterward ( OLD=$IFS IFS=”:”; read . ;IFS=$OLD ).
The default IFS is special in that 2 fields can be separated by one or more spaces. When you set IFS to something else, the fields are separated by exactly one character:
See how the :: in the middle infact defines an additional empty field.
The fields are separated by exactly one character, but the character can be different between each field:
Are you sure?
Ask for a path with a default value
Note: The -i option was introduced with Bash 4
The user will be prompted, he can just accept the default, or edit it.
Источник
Команда read в Bash
Bash поставляется с рядом встроенных команд, которые можно использовать в командной строке или в сценариях оболочки.
В этой статье мы рассмотрим встроенную команду read .
Встроенное read Bash
read — это встроенная команда bash, которая считывает строку из стандартного ввода (или из файлового дескриптора) и разбивает строку на слова. Первое слово присваивается первому имени, второе — второму имени и так далее.
Общий синтаксис встроенной функции read имеет следующий вид:
Чтобы проиллюстрировать, как работает команда, откройте терминал, введите read var1 var2 и нажмите «Enter». Команда будет ждать, пока пользователь введет данные. Введите два слова и нажмите «Enter».
Слова присваиваются именам, которые передаются команде read качестве аргументов. Используйте echo или printf чтобы проверить это:
Вместо того, чтобы вводить текст на терминале, вы можете передать стандартный ввод для read с помощью других методов, таких как piping, here-string или heredoc :
Вот пример использования строки здесь и printf :
Если команде read не задан аргумент, вся строка присваивается переменной REPLY :
Если количество аргументов, предоставленных для read , больше, чем количество слов, прочитанных из ввода, оставшиеся слова присваиваются фамилии:
В противном случае, если количество аргументов меньше количества имен, оставшимся именам присваивается пустое значение:
По умолчанию read интерпретирует обратную косую черту как escape-символ, что иногда может вызывать неожиданное поведение. Чтобы отключить экранирование обратной косой черты, вызовите команду с параметром -r .
Ниже приведен пример, показывающий, как работает read при вызове с параметром -r и без него:
Как правило, вы всегда должны использовать read с параметром -r .
Изменение разделителя
По умолчанию при read строка разбивается на слова с использованием одного или нескольких пробелов, табуляции и новой строки в качестве разделителей. Чтобы использовать другой символ в качестве разделителя, присвойте его переменной IFS (внутренний разделитель полей).
Когда IFS установлен на символ, отличный от пробела или табуляции, слова разделяются ровно одним символом:
Строка разделена четырьмя словами. Второе слово — это пустое значение, представляющее отрезок между разделителями. Он создан, потому что мы использовали два символа-разделителя рядом друг с другом ( :: .
Для разделения строки можно использовать несколько разделителей. При указании нескольких разделителей присваивайте символы переменной IFS без пробела между ними.
Вот пример использования _ и — качестве разделителей:
Строка подсказки
При написании интерактивных сценариев bash вы можете использовать команду read для получения пользовательского ввода.
Чтобы указать строку приглашения, используйте параметр -p . Подсказка печатается перед выполнением read и не включает новую строку.
Вот простой пример:
Как правило, вы будете использовать для read команды внутри в while цикл , чтобы заставить пользователя дать один из ожидаемых ответов.
Приведенный ниже код предложит пользователю перезагрузить систему :
Если сценарий оболочки просит пользователей ввести конфиденциальную информацию, например пароль, используйте параметр -s который сообщает read не печатать ввод на терминале:
Назначьте слова в массив
Чтобы присвоить слова массиву вместо имен переменных, вызовите команду read с параметром -a :
Когда даны и массив, и имя переменной, все слова присваиваются массиву.
Выводы
Команда read используется для разделения строки ввода на слова.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник