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

40

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

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

echo "Enter your name"
read name

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

    
задан user208413 28.10.2013 в 09:35
источник

7 ответов

61

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

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

MYVARIABLE="Any string"

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

#!/bin/bash

source <filename>
echo $MYVARIABLE
    
ответ дан Takkat 28.10.2013 в 10:44
37

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

#!/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
    
ответ дан Radu Rădeanu 28.10.2013 в 09:44
9

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

read name < file_containing _the_answer

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

while read LINE; do echo "$LINE"; done < file_containing_multiple_lines
    
ответ дан thom 28.10.2013 в 23:35
6

Один из альтернативных способов сделать это - просто перенаправить стандартный ввод в ваш файл, где у вас есть все пользовательские ввод в том порядке, в котором его ожидает программа. Например, с программой (называемой 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 внутри вашего скрипта для чтения содержимого файла в avariable - в этом случае вам нужно, чтобы каждый файл содержал только одну строку, только с желаемым значением для этой конкретной переменной. В приведенном выше примере вы разделили бы входной файл на один с именем (например, name.in ) и один с возрастом (скажем, age.in ) и изменили строки read name и read age на name=$(cat name.in) и age=$(cat age.in) соответственно.

    
ответ дан Tomas Lycken 28.10.2013 в 10:57
2

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

name='cat "$file"'
    
ответ дан nedim 17.09.2015 в 16:53
1

Я нашел рабочее решение здесь: Ссылка

if [ -f $SETTINGS_FILE ];then
    . $SETTINGS_FILE
fi
    
ответ дан Lukasz 24.01.2016 в 16:33
0

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

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" ............................
    
ответ дан George 10.06.2015 в 18:47