Я хочу вставить в свой скрипт значение (строку), которое я бы прочитал из текстового файла.
Например, вместо:
echo "Enter your name"
read name
Я хочу прочитать строку из другого текстового файла, поэтому интерпретатор должен читать строку из файла, а не пользовательский ввод.
Для чтения переменных из файла мы можем использовать источник
или .
Предположим, что файл содержит следующую строку
MYVARIABLE="Any string"
. Затем мы можем импортировать эту переменную, используя
#!/bin/bash
source <filename>
echo $MYVARIABLE
Учитывая, что вы хотите, чтобы все содержимое вашего текстового файла хранилось в вашей переменной, вы можете использовать:
#!/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
Вы можете сделать это внутри вашего скрипта:
read name < file_containing _the_answer
Вы даже можете сделать это несколько раз, например, в цикле
while read LINE; do echo "$LINE"; done < file_containing_multiple_lines
. Один из альтернативных способов сделать это - просто перенаправить стандартный ввод на ваш файл, где у вас есть весь пользовательский ввод в том порядке, в котором это ожидает программа. Например, с программой (называемой 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)
соответственно.
Я нашел здесь рабочее решение: https://af-design.com/2009/07/07/loading-data-into-bash-variables/
if [ -f $SETTINGS_FILE ];then
. $SETTINGS_FILE
fi
name=$(<"$file")
Dari man bash: 1785
, penggantian perintah ini adalah setara ke name = $ (cat "$ file")
tetapi lebih pantas.
Если вы хотите использовать несколько строк, вы можете использовать:
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" ............................
#! /bin/bash
# (GPL3+) Alberto Salvia Novella (es20490446e)
variableInFile () {
variable=${1}
file=${2}
source ${file}
eval value=\$\{${variable}\}
echo ${value}
}
variableInFile ${@}
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.
Этот вопрос немного расплывчатый, отсюда и множество странных ответов; фактически, некоторые ответы на этой странице вообще не касаются исходного вопроса.
Тем не менее, если вы хотите получить (прочитать) переменную 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)