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

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

テキストファイルがあります変数.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を使って行を読まないでください。そしてより多くの引用を使う

答え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

関連情報