![bash 中变量为空](https://linux22.com/image/217575/bash%20%E4%B8%AD%E5%8F%98%E9%87%8F%E4%B8%BA%E7%A9%BA.png)
看这段代码:
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);
已设置。但是,第二个变量 ( 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")
,但不起作用。
我应该怎么办?
更新
我在容器内运行。docker exec -it container_name bash
如果我find -mindepth 1 -maxdepth 1 -type d | while read temp; do name=hi; echo $name; done
直接在 bash 中运行之后,它就可以工作。但是,如果我将其保存在文件中并运行它,那么./script
它会打印为空。
答案1
这就是问题所在。
我们的脚本(这是一个构建脚本)是动态生成的。在脚本生成过程中,步骤如下:
envsubst < /path/to/script/template > /path/to/generated/script
这意味着脚本模板内使用的任何变量都将被替换envsubst
为空值。
例如,如果您有Name=John; echo $John;
此内容,则会将其转换Name=John; echo ;
为生成的脚本中。
由于我们生成的脚本将在 docker 映像内运行,因此我们不知道这就是问题所在。我们假设它只是动态设置一些参数的脚本模板。然而,当我们进行调查时,很明显问题出在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