web-dev-qa-db-ja.com

ファイルから変数を読み取るにはどうすればよいですか?

テキストファイルから読み取る値(文字列)をスクリプトに挿入します。

たとえば、次の代わりに:

echo "Enter your name"
read name

インタプリタがユーザー入力ではなくファイルから文字列を読み取るように、別のテキストファイルから文字列を読み取りたいです。

64
user208413

ファイルから変数を読み取るには、sourceまたは.コマンドを使用できます。

ファイルに次の行が含まれていると仮定しましょう

MYVARIABLE="Any string"

次に、この変数をインポートできます

#!/bin/bash

source <filename>
echo $MYVARIABLE
94
Takkat

テキストファイルのすべてのコンテンツを変数に保持することを考慮して、以下を使用できます。

#!/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
54
Radu Rădeanu

スクリプト内からこれを行うことができます。

read name < file_containing _the_answer

これを複数回行うこともできます。ループで

while read LINE; do echo "$LINE"; done < file_containing_multiple_lines
11
thom

これを行う1つの代替方法は、標準入力をファイルにリダイレクトすることです。この場合、すべてのユーザー入力がプログラムで期待される順序になります。たとえば、プログラムで(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

次の2つの方法のいずれかでターミナルからこれを実行できます。

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

また、スクリプトを実行してデータを手動で入力するのと同じです。「Hello Tomas。あなたは26歳ですか?」という行が出力されます。

RaduRădean には 既に提案されている があるため、スクリプト内でcatを使用してファイルの内容を変数に読み込むことができます。その場合、それぞれが必要ですその特定の変数に必要な値のみを含む1行のみを含むファイル。上記の例では、入力ファイルを名前のあるファイル(たとえば、name.in)と年齢のファイル(たとえば、age.in)に分割し、read nameread age行をそれぞれname=$(cat name.in)およびage=$(cat age.in)に追加します。

7
Tomas Aschan

私はここで実用的なソリューションを見つけました: https://af-design.com/2009/07/07/loading-data-into-bash-variables/

if [ -f $SETTINGS_FILE ];then
    . $SETTINGS_FILE
fi
3
Lukasz
name=$(<"$file") 

man bash:1785から、このコマンド置換はname=$(cat "$file")と同等ですが、より高速です。

3
hellork

簡潔な答え:

name=`cat "$file"`
2
nedim
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


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

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


variableInFile ${@}

これを使用して、ファイルから単一の変数を取得します

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

GET_VAR${FILE}が見つからない場合、|| trueのおかげでエラーが発生するのではなく、空白になります。

GNU grepにあるgrep -Pを使用しますが、これを書いている時点ではすべてのgrepでデフォルトではありません。

0
Eric Nemchik

複数の文字列を使用する場合は、次の方法を使用できます。

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

OR

ユーザーにファイルを指定してほしい場合

read -e "Specify path to variable(s): " path;
for p in 'cat "$path"';
do echo "$p" ............................
0
George