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

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

Например, вместо:

echo "Enter your name"
read name

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

85
задан 28 October 2013 в 14:03

11 ответов

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

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

MYVARIABLE="Any string"

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

#!/bin/bash

source <filename>
echo $MYVARIABLE
117
ответ дан 28 October 2013 в 14:03

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

#!/bin/bash

file="/path/to/filename" #the file where you keep your string name

name=$(cat "$file")        #the output of 'cat $file' is assigned to the $name variable

echo $name               #test

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

#!/bin/bash

file="/path/to/filename"     #the file where you keep your string name

read -d $'\x04' name < "$file" #the content of $file is redirected to stdin from where it is read out into the $name variable

echo $name                   #test
71
ответ дан 28 October 2013 в 14:03

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

read name < file_containing _the_answer

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

while read LINE; do echo "$LINE"; done < file_containing_multiple_lines
14
ответ дан 28 October 2013 в 14:03

. Один из альтернативных способов сделать это - просто перенаправить стандартный ввод на ваш файл, где у вас есть весь пользовательский ввод в том порядке, в котором это ожидает программа. Например, с программой (называемой script.sh )

#!/bin/bash
echo "Enter your name:"
read name
echo "...and now your age:"
read age

# example of how to use the values now stored in variables $name and $age
echo "Hello $name. You're $age years old, right?"

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

Tomas
26

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

$ cat input.in | ./script.sh
$ ./script.sh < input.in

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

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

7
ответ дан 28 October 2013 в 14:03

Короткий ответ:

name=`cat "$file"`
2
ответ дан 28 October 2013 в 14:03

Я нашел здесь рабочее решение: https://af-design.com/2009/07/07/loading-data-into-bash-variables/

if [ -f $SETTINGS_FILE ];then
    . $SETTINGS_FILE
fi
4
ответ дан 28 October 2013 в 14:03
name=$(<"$file") 

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

7
ответ дан 28 October 2013 в 14:03

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

path="/foo/bar";
for p in `cat "$path"`;
do echo "$p" ....... (here you would pipe it where you need it) 

ИЛИ

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

read -e "Specify path to variable(s): " path;
for p in 'cat "$path"';
do echo "$p" ............................
0
ответ дан 28 October 2013 в 14:03
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


variableInFile ${@}
0
ответ дан 28 October 2013 в 14:03

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

GET_VAR=$(grep --color=never -Po "^${GET_VAR}=\K.*" "${FILE}" || true)

Ha GET_VAR nem található a $ {FILE} 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.

0
ответ дан 28 October 2013 в 14:03

Этот вопрос немного расплывчатый, отсюда и множество странных ответов; фактически, некоторые ответы на этой странице вообще не касаются исходного вопроса.

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

WORKING_VARIABLE=$(source /path/script.sh; echo $FILE_VARIABLE)

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

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

source /path/script.sh

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

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

0
ответ дан 5 January 2021 в 23:17

Другие вопросы по тегам:

Похожие вопросы: