Bash прочитать переменную из файла

Обновлено: 02.07.2024

как перебирать каждую строку текстового файла с помощью Баш?

Я получаю этот вывод на экране:

(позже я хочу сделать что-то более сложное с $p чем просто вывод на экран.)

переменной окружения SHELL is (от env):

/bin/bash --version выход:

cat /proc/version вывод:

файл пептидов.txt содержит:

один из способов сделать это:

как указано в комментариях, это имеет побочные эффекты обрезки ведущих пробелов, интерпретации последовательностей обратной косой черты и пропуска конечной линии, если в ней отсутствует завершающий поток строк. Если это проблемы, вы можете сделать:

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

вот, 10 это просто произвольное число (отличное от 0, 1, 2).

вариант 1a: while loop: одна строка за раз: перенаправление ввода

Вариант 2: for loop: чтение файла в одну переменную и синтаксический анализ.
Этот синтаксис будет анализировать "линии" на основе любого пробела между токенами. Это все еще работает, потому что данное входные строки файла-это однословные маркеры. Если бы было более одного токена на строку, то этот метод не работал бы. Кроме того, чтение полного файла в одну переменную не является хорошей стратегией для больших файлов.

это не лучше, чем другие ответы, но это еще один способ выполнить работу в файле без пробелов (см. комментарии). Я обнаружил, что мне часто нужны однострочные, чтобы копаться в списках в текстовых файлах без дополнительного шага использования отдельных файлов сценариев.

этот формат позволяет мне поместить все это в одну командную строку. Измените часть "echo $word" на то, что вы хотите, и вы можете выдавать несколько команд, разделенных точкой с запятой. В следующем примере используется файл содержимое в качестве аргументов в двух других сценариях, которые вы, возможно, написали.

или если вы собираетесь использовать это как редактор потока (learn sed), вы можете сбросить вывод в другой файл следующим образом.

я использовал их, как написано выше, потому что я использовал текстовые файлы, где я создал их с одним словом в строке. (См. комментарии) Если у вас есть пробелы, которые вы не хотите разбивать свои слова / строки, это становится немного уродливее, но та же команда все еще работает как следует:

Это просто говорит оболочке разбиваться только на новые строки, а не пробелы, а затем возвращает среду обратно к тому, что было ранее. На этом этапе вы можете рассмотреть вопрос о том, чтобы поместить все это в сценарий оболочки, а не сжимать все это в одну строку.

Я хочу вставить в мой скрипт значение (строку), которое я бы прочитал из текстового файла.

Я хочу прочитать строку из другого текстового файла, поэтому интерпретатор должен читать строку из файла, а не пользовательский ввод.

Как выглядит ваш текстовый файл? Является ли весь файл 1 переменной или это KEY=VALUE пары? Решения совершенно разные (если это последнее, то ответ Такката применим, а ответ прежнего Раду) @CiroSantilli не является перекрестным, если он был опубликован другим пользователем, не существует такой вещи, как «дубликат между сайтами». Единственное, чего следует избегать, это один и тот же вопрос, задаваемый одним и тем же пользователем на разных сайтах.

Для чтения переменных из файла мы можем использовать команду source or . .

Предположим, что файл содержит следующую строку

затем мы можем импортировать эту переменную, используя

Одна из причин, по которой вы, возможно, не захотите делать это таким образом, заключается в том, что все, что находится внутри, <filename> будет запущено в вашей оболочке, например rm -rf / , что может быть очень опасным. Поздно на вечеринке, но, нет, это не заслуживает того, чтобы быть отмеченным ИЛИ как ответ. Это создает другой исходный файл bash, который НЕ является тем, что запрашивал OP. Он спросил, как прочитать содержимое ФАЙЛА в переменную. НЕ как выполнить другой скрипт, который устанавливает переменную . Правильный ответ приведен ниже. name = $ (cat "$ file"). ОТО, это ответ на вопрос, который я задал Google, и Google привел меня сюда. Странные времена, а? Отлично работает и для нескольких переменных! Точка @MarkRibau понятна, но я думаю, что если вы исправите файл в другом скрипте и просто должны передать его в порядке и контролируемо. Вы можете использовать, sed чтобы добавить local ключевое слово и сделать сценарий немного более безопасным и не разрушить вашу глобальную область. Так что внутри функции, cat global_variables.sh | sed -e 's/^/local /' > local_variables.sh а затем использовать . ./local_variables.sh . Все, что вы импортируете в функцию, будет доступно только в этой функции. Обратите внимание, что предполагается, что global_variables.sh содержит только одну переменную на строку.

Учитывая, что вы хотите, чтобы все содержимое вашего текстового файла было сохранено в вашей переменной, вы можете использовать:

Или в чистом виде:

Я не хочу отображать переменную, я хочу, чтобы эта переменная была прочитана скриптом для дальнейшей обработки. Я пробовал awk, который читает построчно. Ок, удали echo $name . Я использую это только для теста. Далее вы можете использовать $name переменную для дальнейшей обработки в любом месте вашего скрипта. Я не могу использовать его в любом месте моего сценария, потому что сценарий не знает значение переменной. В нашем случае имя переменной. @ user208413 Значением $name переменной является строка из вашего файла, назначенная с помощью cat $file команды. Что не понятно или так сложно понять? Излишне использовать отдельную $file переменную, если вы используете ее только один раз для загрузки $name переменной, просто используйте cat /path/to/file

Из вашего скрипта вы можете сделать это:

Вы даже можете сделать это несколько раз, например, в цикле

Это читает всю строку файла, а не переменную, объявленную в файле.

и входной файл (называется input.in )

Вы можете запустить это из терминала одним из следующих двух способов:

и это было бы равносильно простому запуску сценария и вводу данных вручную - это вывело бы строку «Здравствуйте, Томас. Вам 26 лет, верно?».

Для чтения переменных из файла мы можем использовать источник или .

Предположим, что файл содержит следующую строку

. Затем мы можем импортировать эту переменную, используя

Учитывая, что вы хотите, чтобы все содержимое вашего текстового файла хранилось в вашей переменной, вы можете использовать:

Или в чистом bash:

Вы можете сделать это внутри вашего скрипта:

Вы даже можете сделать это несколько раз, например, в цикле

и входным файлом (с именем input.in )

вы можете запустить ее с терминала в одном из следующими двумя способами:

и это будет эквивалентно простому запуску скрипта и ручному вводу данных - он напечатает строку «Привет, Томас. Тебе 26 лет, верно?».

Как ] Раду Рэдеану уже предложил ,вы можете использовать cat внутри вашего скрипта, чтобы прочитать содержимое файла в переменную - в этом случае вам нужно, чтобы каждый файл содержал только одну строку, с только тем значением, которое вы хотите для этой конкретной переменной. В приведенном выше примере вы разделите входной файл на один с именем (скажем, name.in ) и на один с возрастом (скажем, age.in ), и измените строки read name и read age на name = $ (cat name.in) и age = $ (cat age.in) соответственно.

Dari man bash: 1785 , penggantian perintah ini adalah setara ke name = $ (cat "$ file") tetapi lebih pantas.

Если вы хотите использовать несколько строк, вы можете использовать:

Если вы хотите, чтобы пользователь указал файл

ответ дан Alberto Salvia Novella 28 October 2013 в 14:03

Ezt használom egyetlen változó megszerzéséhez egy fájlból

Ha GET_VAR nem található a $ it üres lesz, nem pedig hibát okoz a || igaz .

A grep -P szót használja, amely GNU grep-ben van, de ennek megírásakor nem alapértelmezett az egész grep-ben.

Тем не менее, если вы хотите получить (прочитать) переменную bash из другого файла, лучшим решением всегда будет использовать подоболочку чтобы не возникало конфликтов между вашим сценарием и файлом, который читается:

Мы используем этот метод в SlickStack для многократного получения файла конфигурации без конфликтов.

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

Но в случаях, не связанных с переменными bash, например, в ситуации OP при желании прочитать простая «строка» из текстового файла, ни одно из этих решений не будет работать, и вам придется использовать решение, адаптированное к синтаксису кода, который вы пытаетесь прочитать . например, один из примеров на этой странице с помощью комбинаций grep или awk или @thom [1 182158] решение для чтения заданной строки файла с использованием read .

TL; подоболочки DR лучше всего подходят для переменных bash, в противном случае это зависит от синтаксиса файла . если вы хотите сохранить содержимое файла как переменную bash,попробуйте cat , как описано в (hidden)

выглядит куда нагляднее (не то, что башизм $(<"$pid_file") ). Но, приведя пульс в порядок и отогнав приступ праведного гнева, я стал размышлять над этой строчкой:

  • не порождаются суб-шелл и cat (минус два форка)
  • читается почти как well-written prose (если не считать косяк в виде имени line для переменной, содержащей pid)
  • надо брать на вооружение

Беглый анализ показывает, что в современном Дебиане оба подхода примерно одинаково популярны:

Что скажут ценители?

Ну, и для развлечения тест производительности :-)

Смысл мерить производительность? Если скрипт упирается в скорость чтения переменной из файла, то возможно инструмент выбран не очень удачно.

на с с файлом в tmpfs будет ещё быстрее /thread


А зачем здесь while?


Интересненько. Возьму на заметку, спасибо.

OMG, Капитан Очевидность

Epic battle: builtin VS external programs.


на с с файлом в tmpfs будет ещё быстрее /thread


Но, приведя пульс в порядок и отогнав приступ праведного гнева, я стал размышлять над этой строчкой:

и да, я об этом уже Over9000 здесь говорил: не знаешь ЯП, не проводи тесты. Это смешно и грустно.

emulek ★ ( 26.03.15 16:13:24 )
Последнее исправление: emulek 26.03.15 16:14:56 (всего исправлений: 1)


говнокод в каждой строке if ((i<$1))

emulek ★ ( 26.03.15 16:16:34 )
Последнее исправление: emulek 26.03.15 16:18:37 (всего исправлений: 1)

Что же тогда ты видишь в первой строчке моего поста?!

Каюсь, с башем и его башизмами работаю только в read-only режиме, а православный posix-шелл таких конструкций не позволяет. Но здесь это роли не играет, т.к. интересно сравнение именно только одной операции. Адаптация скрипта к рюшечкам баша сделала бы сравнение менее честным.

А вообще жаль, что основное внимание общественности привлекло несчастное сравнение производительности, добавленное мною для забавы.

Я хотел почитать мнения людей о выразительности этой конструкции, а не о её производительности.

Это же дедовский способ сравнить время выполнения очень коротких операций: повторить их по одинаково очень много раз, чтобы суммарное время выполнения цикла было сильно больше времени затраченного на всякие константные накладные расходы (в данном случае — создание процесса, echo в конце).

Видишь ли, дело в том, что ты сравниваешь отнюдь не эквивалентные конструкции.
Подсказка: что будет, если файл случайно окажется Большой Советской Энциклопедией - все 50+ томов в rtf?

Видишь ли, дело в том, что ты сравниваешь отнюдь не эквивалентные конструкции.

Они не эквивалентные, но они обе способны решать простую задачу — считать строковое значение переменной из файла (согласен, в первом посте это не было обозначено достаточно явно). Понятно, что read не считает более одной строки. Сама эта задача и есть предмет обсуждения. Конструкции я сравниваю только в её контексте.


TGZ ★★★★ ( 27.03.15 01:28:29 )
Последнее исправление: TGZ 27.03.15 01:36:20 (всего исправлений: 1)


Как можно говорить за выразительность с тем, кто не разумеет используемый язык?

Имеется файл (makefile), который начинается со строк:

Они формируют версию ядра линукса. Необходимо, чтобы мой скрипт мог сформировать из этих строк версию 4.1.41.2 и инициализировал ей переменную. Я знаю, что можно вызвать grep -w 'VERSION' test.txt , склеить строки посредством cat , но как вычленить из этих строк цифры?

Почему все отвечающие не могут на минуточку остановиться и подумать? При make prepare формируется файл с готовым макро для версии. Запустив на него cpp (не путать с g++) с правильнымми параметрами получите сразу готовую строку

например, можно использовать программу gnu/make для того, чтобы получить нужную вам строку ( 4.1.41.2 ).

для этого надо подготовить (можно прямо на лету) маленький makefile. в него должны попасть нужные вам четыре строки и ещё одна — с правилом (rule в терминологии make), которое и выведет значения нужных переменных.

получение четырёх требуемых строк:

правило, печатающее эти переменные:

выведет уже полноценный makefile:

отправим его на выполнение программе gnu/make:

что и требовалось.

пояснения про grep и оболочку:

  • grep '^\(строка1\|строка2\)\>' — выведет строки, которые начинаются со строка1 или строка2 , за которыми идёт граница слова ( \> ) — конец строки, пробел, знак препинания и т.п.
  • < команда1; команда2; >| команда3 — выполнится команда1 , затем команда2 , а всё что они вывели в stdout, будет передано на stdin для команды3

пояснения про gnu/make:

цель:;команда — это просто альтернативная (в одну строку) запись правила:

цель:;@команда , или полностью:

если команда предварена символом @ , то сам её текст не будет выведен программой gnu/make при выполнении правила

можно вот такую многоэтажную конструкцию использовать на языке программирования, понятном интерпретатору awk:

Читайте также: