I want to insert in my script a value (string) that I would read from a text file.
For example, instead of:
echo "Enter your name"
read nameI want to read a string from another text file so the interpreter should read the string from the file and not the user input.
211 Answers
To read variables from a file we can use the source or . command.
Lets assume the file contains the following line
MYVARIABLE="Any string"we can then import this variable using
#!/bin/bash
source <filename>
echo $MYVARIABLE 8 Considering that you want all the content of your text file to be kept in your variable, you can use:
#!/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 #testOr, in pure 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 7 From within your script you can do this:
read name < file_containing _the_answerYou can even do this multiple times e.g. in a loop
while read LINE; do echo "$LINE"; done < file_containing_multiple_lines 2 name=$(<"$file") From man bash:1785, this command substitution is equivalent to name=$(cat "$file") but faster.
One alternative way to do this would be to just redirect standard input to your file, where you have all the user input in the order it's expected by the program. For example, with the program (called 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?"and the input file (called input.in)
Tomas
26you could run this from the terminal in one of the following two ways:
$ cat input.in | ./script.sh
$ ./script.sh < input.inand it would be equivalent to just running the script and entering the data manually - it would print the line "Hello Tomas. You're 26 years old, right?".
As Radu Rădeanu has already suggested, you could use cat inside your script to read the contents of a file into a avariable - in that case, you need each file to contain only one line, with only the value you want for that specific variable. In the above example, you'd split the input file into one with the name (say, name.in) and one with the age (say, age.in), and change the read name and read age lines to name=$(cat name.in) and age=$(cat age.in) respectively.
I found working solution here:
if [ -f $SETTINGS_FILE ];then . $SETTINGS_FILE
fi 1 Short answer:
name=`cat "$file"` If you want to use multiple strings, you could go with:
path="/foo/bar";
for p in `cat "$path"`;
do echo "$p" ....... (here you would pipe it where you need it) OR
If you want the user to indicate the file
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 ${@} I use this to get a single variable from a file
GET_VAR=$(grep --color=never -Po "^${GET_VAR}=\K.*" "${FILE}" || true)When GET_VAR is not found in ${FILE} it will be blank rather than causing an error thanks to the || true.
It uses grep -P which is in GNU grep but not default in all grep at the time of writing this.
This question is a bit vague, hence a lot of the bizarre responses; in fact, some of the answers on this page do not even address the original question whatsoever.
That said, if you want to source (read) a bash variable from a different file, the best solution is always to use a subshell so that no conflicts arise between your script and the file that is being read:
WORKING_VARIABLE=$(source /path/script.sh; echo $FILE_VARIABLE)We use this method in SlickStack for sourcing the config file multiple times without conflicts.
If you plan to use multiple variables from the file or have other reasons to include the entirety of the other file in your current script, then you might source the entire file:
source /path/script.shBut in non-bash-variable cases, such as the OP situation of wanting to read a simple "string" from a text file, neither of these solutions would work, and you'd have to use a solution that is tailored to the syntax of the code you are trying to read... for example, one of the examples on this page using grep or awk combinations, or @thom solution for reading a given line of a file using read.
TL;DR subshells are best for bash variables, otherwise it depends on the syntax of the file.... if you want to save the file contents as a bash variable, try cat as explained by @hellork.