このコードを見てください:
find /Api -mindepth 1 -maxdepth 1 |
while read DependencyPath;
do
DependencyName=$(basename $DependencyPath);
DependencyOrganization="Api";
echo $DependencyOrganization - $DependencyName;
done
出力は次のとおりです。
- Courses
- Media
- Orders
- Blog
最初の変数()DependencyName=$(basename $DependencyPath);
は設定されますが、2番目の変数(DependencyOrganization="Api"
)は設定されません。
なぜ設定されていないのかわかりません。私も試してみましたbash -x /script
。これはログです:
+ find /Api -mindepth 1 -maxdepth 1
+ read DependencyPath
++ basename /Api/Courses
+ DependencyName=Courses
+ DependencyOrganization=Api
+ echo - Courses
- Courses
+ read DependencyPath
++ basename /Api/Media
+ DependencyName=Media
+ DependencyOrganization=Api
+ echo - Media
+ read DependencyPath
- Media
私も試してみましたが、DependencyOrganization=$(echo "Api")
うまくいきません。
どうすればいいですか?
修正する
コンテナの中で走っています。 bashで直接実行するdocker exec -it container_name bash
とfind -mindepth 1 -maxdepth 1 -type d | while read temp; do name=hi; echo $name; done
機能します。ちなみにファイルとして保存して実行すると./script
空白に出力されます。
答え1
ここに問題があります。
私たちのスクリプト(ビルドスクリプト)は動的に生成されます。スクリプト生成プロセスのステップは次のとおりです。
envsubst < /path/to/script/template > /path/to/generated/script
envsubst
これは、スクリプトテンプレート内で使用されるすべての変数がnull値に置き換えられることを意味します。
たとえば、このコンテンツがあると、生成されたスクリプトにName=John; echo $John;
変換されます。Name=John; echo ;
私たちが生成したスクリプトはドッカーイメージ内で実行されるので、これが問題かどうかはわかりません。いくつかのパラメータを動的に設定するスクリプトテンプレートであるとします。しかし、調査をしてみると問題があることが明らかになりましたenvsubst
。
したがって、次のように使用する必要があります。
# This line is for envsubst. It won't be expanded, since it's single quotes
Name='$Name'
envsubst < /path/to/script/template > /path/to/generated/script