【问题标题】:Variable isn't initialized in script passed through heredoc变量未在通过heredoc 传递的脚本中初始化
【发布时间】:2019-11-07 04:48:47
【问题描述】:

请考虑以下 sn-p 应该进入 kubernetes mysql pod 容器并应该将 BAR 变量初始化为 mysql 数据库列表。

kubectl -n somens exec -i mysql-69df7d4c77-hxtng bash <<EOF
echo Hello;
BAR=$(echo "show databases" | mysql -u root -pwhatever)
echo "BAR=\$BAR"
EOF 

如果我换行

 BAR=$(echo "show databases" | mysql -u root -pwhatever)

echo "show databases" | mysql -u root -pwhatever

我将在执行整个 sn-p 时打印出一个数据库列表。

当我运行原始文件时,我得到了空的 BAR 变量。

现在我知道 BAR 可以被初始化,并且当我尝试将它设置为测试字符串并打印出来时,我正在正确打印它。

目前我有一个运行的脚本:

BAR=$(echo "show databases" | mysql -u root -pwhatever)

在容器外而不是在“heredoc”内,它会正确初始化变量。

如何使用“heredoc”正确初始化 bar?我道歉 对于示例的特殊性,不想丢失将其转换为我认为相似的细节而不是实际的细节(这里的开发人员很差)。

【问题讨论】:

    标签: bash heredoc


    【解决方案1】:

    假设你想在你正在启动的容器中运行这个特定的mysql 命令,在这种情况下运行heredoc 将会对内容进行两次解析,一次由本地shell,然后再次由目标shell(通过容器)。所以你需要确保本地shell完成的第一级解析不会扩展变量或扩展命令替换。

    您可以通过在 $ 前面加上 \$ 前缀来转义任何发生在 $ 的扩展,这意味着坚持本地 shell 推迟扩展它并让它通过并由容器内的 shell 解释。

    kubectl -n somens exec -i mysql-69df7d4c77-hxtng bash <<EOF
    echo Hello;
    BAR=\$(echo "show databases" | mysql -u root -pwhatever)
    echo "BAR=\$BAR"
    EOF
    

    或使用带引号分隔符的特殊情况的heredoc,而不是使用'EOF' 来禁用本地shell 完成的任何解析的EOF。因此,使用这种方法,不再需要任何手动转义。

    kubectl -n somens exec -i mysql-69df7d4c77-hxtng bash <<'EOF'
    echo Hello;
    BAR=$(echo "show databases" | mysql -u root -pwhatever)
    echo "BAR=$BAR"
    EOF
    

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2012-09-01
      • 2020-02-02
      • 2023-03-06
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多