テキストファイルがあります変数.txt私が変数を保存する場所
ホスト=/srv/www/vhosts/hosting
指数=$ホスト/index.php
ご覧のとおり、2番目の変数は最初の変数によって異なります。
また、これらの変数をロードするスクリプトファイルもあります。
f=~/variables.txt
for line in $(cat $f)
do
export $line
done
スクリプトファイルを実行すると、最初の変数はロードされますが、2番目の変数はロードされません。
bash: $host/index.php: No such file or directory
これは、最初の変数をロードした後であるためです。所有者、2番目の変数を設定するために使用された値を覚えていません。索引。
それでは、この問題を解決する方法は?export
ループに設定された変数の値を記憶するために(?)追加のオプションまたは引数を渡す必要があると思いますfor
。
答え1
最初に注目すべき点は、これらの変数をエクスポートする必要がないことです。ただ子プロセスが継承された環境で変数を照会する場合。最も一般的には、人々は変数をエクスポートしてから同様の操作を実行しますsomecmd "$myexportedvar"
。あなたの殻は$myexportedvar
あなたが見る前に拡張されます。somecmd
その環境から抽出するためにこれらのサブプロセスをエクスポートする必要がある場合:
while IFS= read -r line; do
if [[ $line == *=* && $line != #* ]]; then
IFS== read -r var val <<<"$line"
printf -v "$var" '%s' "$val"
export "$var"
fi
done < "$HOME/variables.txt"
このループは、その行が割り当て(一種の)であり、最初の文字がコメントハッシュではないことを確認します。努力をより強くするのはやっぱりそうです。この問題をより慎重に処理するには、以下の2つのオプションを参照してください。
ところで、上記のループはあなたが実装する解析されたファイルです。source
各行を評価して実際に実行すると、ループはその「問題」を削除します(問題と思われる場合)。
または、ソースファイルの変数をエクスポートすると、source "$HOME/variables.txt"
操作は完了します。
ただ使用したいかもしれませんset -a; . "$HOME"/variables.txt; set +a
。これにより、ソースファイルに含まれていない問題を回避できます。ホロ宿題。上記の解析ループは誤った肯定を引き起こす可能性があります。help set
それが何をしているのかを知るには、読んでください。
答え2
これを行うより簡単な方法があります。
cat vars
host=/srv/www/vhosts/hosting
index=$host/index.php
私のテストスクリプト:
#!/bin/bash
. ./vars
echo $host
echo $index
実装する
./printvars.sh
/srv/www/vhosts/hosting
/srv/www/vhosts/hosting/index.php
デフォルトでは、../vars はファイルを実行し、変数をロードします。
答え3
私の提案は、そのファイルをインポートして「variables.txt」ファイルのすべての内容をエクスポートすることです。最新のテキストエディタでは、「列の編集」を許可する必要があります。それ以外の場合は、変更内容をスクリプトとして作成できます。
しかし、次のスクリプトを使用して質問に答えました。
#!/bin/sh
f=./variables.txt
source ${f}
for vname in $(cut -f1 -d'=' ${f})
do
export ${vname}
done
違いは、すべての変数がこのシェルの範囲内で定義され、正しい解釈を持つように最初にVariables.txtファイルをインポートすることです。これで、変数名(vname)のみをインポートして、ファイル内のすべての変数をエクスポートできます。
注意して変数を保護するには、${}を使用する必要があります。
答え4
これは2つのステップで実行できます。
. ./vars
while read line; do
export $(printf "%s" "$line" | grep = | cut -d= -f 1)
done < vars
それとも
while read line; do
eval export "$line"
done < vars