Intereting Posts
Live linux дистрибутив, который включает TrueCrypt, который будет использоваться для восстановления данных gcc компиляция завершена с помощью «фатальной ошибки: строка: нет такого файла или каталога #include <string>" какие инструменты я могу использовать, чтобы быстро показать / скрыть некоторые напоминания о себе? Сколько разницы в скорости для tweaked bios против uefi boot? FreeBSD 10: Мне нужны тюрьмы? Как я могу заставить команду «bind» работать в sh shell аутентификация открытого ключа не проходит, почему? Использование функции zsh в поиске? Как сделать терминал user @ машиной выделен жирным шрифтом? Кто командует: что такое S на slackware? Выполнение каждой команды через другую В чем разница между пространством пользователя и пространством ядра? Как настроить Ubuntu для работы с флеш-накопителем? Установка переменных среды по приглашению вместо командной строки debian / XFCE Virtualbox Гость на Mac: как использовать домашние и конечные ключи?

Прочитайте текстовый файл и сохраните информацию в переменной

У меня есть текстовый файл, в котором записи находятся в любом из следующих форматов:

SCI.txt

12-12-1990 12-12-1991 CSE Department 

Или

 12-12-1990,12-12-1991,CSE Department 

Я хочу, чтобы они хранились в трех переменных

 a,b,c 

Я ищу чтение txt-файла и сохранение значений в переменной с помощью сценария оболочки (ksh).

— Обновить —

Я почти пробовал все методы, доступные в Интернете. Я не мог заставить их работать.

Сейчас я пробую этот метод.

 #!/usr/bin/ksh #reading the file content and storing in variable _input="sci.txt" while IFS='|' read -r fdate rdate dcname do echo "$fdate $rdate $dcname" done < "$_input" 

sci.txt следующим образом

 demo1|demo2|demo3 

Но я не получаю никакого результата для вышеупомянутого метода.

Похоже, что sci.txt не заканчивается новым символом строки. Как объясняется в man ksh , встроенное чтение читается по умолчанию до первого символа новой строки:

  read [ -ACSprsv ] [ -d delim] [ -nn] [ [ -N n] [ [ -t timeout] [ -u unit] [ vname?prompt ] [ vname ... ] The shell input mechanism. One line is read and is broken up into fields using the characters in IFS as separators. The escape character, \, is used to remove any special meaning for the next character and for line continuation. The -d option causes the read to continue to the first character of delim rather than new-line. 

Итак, если вы не используете -d , он будет искать символ новой строки. Если в вашем файле нет файла, он ничего не прочитает. Проиллюстрировать:

 $ printf 'demo1|demo2|demo3\n' > sci.newline $ printf 'demo1|demo2|demo3' > sci.nonewline $ cat foo.sh #!/usr/bin/ksh for file in sci.newline sci.nonewline; do echo "Running on: $file" while IFS='|' read -r fdate rdate dcname do echo "$fdate $rdate $dcname" done < "$file" done 

Запуск этого скрипта возвращает ожидаемый результат на sci.newline но ничего для sci.nonewline :

 $ foo.sh < sci.nonewline Running on: sci.newline demo1 demo2 demo3 Running on: sci.nonewline 

Итак, если ваш файл заканчивается новой строкой ( \n ), все должно работать так, как ожидалось.


Теперь причина, по которой ваш оператор echo работает вне цикла, состоит в том, что цикл никогда не запускается. Когда read не встречается с символом \n , оно возвращает статус выхода без отказа (отказ). В while SOMETHING; do Конструкция while SOMETHING; do будет работать только до тех пор, пока SOMETHING будет успешным. Поскольку read не выполняется, цикл никогда не запускается, и echo внутри цикла не выполняется. Вместо этого скрипт будет запускать команду read и назначать переменные, а затем, так как read возвращает отказ, оно переходит к следующей части. Вот почему следующее echo , за пределами цикла работает так, как ожидалось.

 while IFS=" ," read abc; do echo a: $ab: $bc: $c done < SCI.txt