bash 中变量为空

bash 中变量为空

看这段代码:

    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

相关内容