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


68

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

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

echo "Enter your name"
read name

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


1
テキストファイルはどのように見えますか?ファイル1全体が変数KEY=VALUEですか、それともペアですか?解決策はまったく異なります(後者の場合、Takkatの答えが当てはまり、前のRaduの答えが当てはまります)
kiri

1
@CiroSantilliは、別のユーザーが投稿した場合はクロスポストされません。「クロスサイト複製」などはありません。避けるべき唯一のことは、異なるサイトの同じユーザーが同じ質問をすることです。
テルドン

回答:


98

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

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

MYVARIABLE="Any string"

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

#!/bin/bash

source <filename>
echo $MYVARIABLE

16
このようにしたくない理由の1つ<filename>は、シェルなどで実行されているrm -rf /ものはすべて非常に危険なためです。
マークリバウ

3
パーティーに遅れて、しかし、いや、それはマークアップまたは答えとして値するに値しません。これは、OPが要求したものではない別のbashソースファイルをソースします。彼は、FILEの内容を変数に読み込む方法を尋ねました。変数設定する別のスクリプトの実行方法ではありません。正解は以下のとおりです。name = $(cat "$ file")。
HörmannHH

2
OTOH、それは私がグーグルに尋ねた質問に対する答えであり、グーグルはここに私を連れてきました。奇妙な時代ですね。
マイケルテリー

1
Greatは複数の変数にも機能します!@MarkRibauのポイントは理解されていますが、別のスクリプトでファイルを修正し、そのファイルを制御された上で渡す必要があると思います。
madlymad

1
キーワードsedを追加localして、スクリプトを少し安全にし、グローバルスコープを汚染しないようにするために使用できます。そのためcat global_variables.sh | sed -e 's/^/local /' > local_variables.sh、aa関数内でdo を使用します. ./local_variables.sh。関数でインポートするものはすべて、その関数でのみ使用可能になります。global_variables.sh1行に1つの変数のみが含まれていると想定していることに注意してください。
Nux

55

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

#!/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

変数を表示したくないので、この変数をさらに処理するためにスクリプトで読み取る必要があります。行ごとに読み取るawkを試しました。
user208413

1
OK、削除しecho $name ます。私はテストのためにそれを使用します。次に、$name変数を使用して、スクリプト内の任意の場所でさらに処理できます。
ラドゥラデアヌ

スクリプトは変数の値を知らないため、スクリプトのどこでも使用できません。この場合、変数名。
user208413

6
@ user208413 $name変数の値は、cat $fileコマンドを使用して割り当てられたファイルの文字列です。明確ではない、またはそれほど理解しにくいものは何ですか?
ラドゥラデアヌ

1
これは、別々に使用する冗長だ$fileあなただけロードするために、一度それを使用している場合、変数を$name変数を、ちょうど使用cat /path/to/file

11

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

read name < file_containing _the_answer

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

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

または、各行に複数の項目があるファイルの場合。。。grep -v ^#file | abcの読み取り中。do echo a = $ ab = $ bc = $ c; 完了
-gaoithe

7

これを行う別の方法の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歳ですか?」という行が出力されます。

以下のようラドゥRădeanuがいる既に提案し、あなたが使用することができcatavariableにファイルの内容を読み取るために、あなたのスクリプト内で-そのような場合には、あなたがその特定の変数にしたいだけの値で、一行だけを含むように各ファイルが必要です。上記の例では、名前(たとえば、と一つに入力ファイルを分割したいname.in)と年齢との1(たとえば、age.in)、および変更read nameread ageに行をname=$(cat name.in) し、age=$(cat age.in)それぞれ。


次のスクリプトがあります。vh = awk "NR == 3 {print; exit}" /var/www/test/test.txtこれでtest.txtという名前のテキストファイルから3行目を読み取ります。文字列を取得したら、この文字列をディレクトリを作成するための入力として使用します
-user208413

1
それをに変更しvh=$(awk "NR==3 {print;exit}" /var/www/test.txt)ます。その後、変数$vhに文字列が保存されるので、次のように使用できmkdir "/var/www/$vh"ます。-これにより、/ var / www内に指定された名前のフォルダーが作成されます。
トマスAschan

私はこの方法で行いましたが、それでもフォルダーを作成でき
ません

@ user208413:どのようなエラーメッセージが表示されますか?「それは動作しません」...残念ながら、ない非常に参考に問題の説明、ある
トマスAschan


3
name=$(<"$file") 

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



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" ............................


0

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

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

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

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


これは私にはうまくいかないようです。最初の$は、不正な文字のエラースロー
ginna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.