テキストファイルがあります変数.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
それが何をしているのかを知るには、読んでください。