値が異なる変数に依存する変数を設定します。

値が異なる変数に依存する変数を設定します。

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

返品、Forを使って行を読まないでください。そしてより多くの引用を使う

おすすめ記事