【问题标题】:Global Variables using Quoted vs. Unquoted Heredocs使用带引号和不带引号的 Heredocs 全局变量
【发布时间】:2020-01-02 01:15:27
【问题描述】:

我很好奇我能不能把我的蛋糕也吃掉。我正在编写一个脚本,需要在远程服务器上找到最新日期的目录。然后我需要构建该路径,以便可以在服务器上找到特定的 .csv 文件。

脚本接受一个名为folder 的输入,它需要附加到路径的末尾。我注意到我可以将文件夹传递到 heredoc 并对其进行扩展,但随后我失去了我需要做的 awk 扩展。这是一个例子:

folder='HBEP'
ssh $server /bin/bash << EOF
ls -t /projects/bison/git |
head -1 |
awk -v folder=$folder '{print "projects/bison/git/"$1"/assessment/LWR/validation/"folder}'
EOF

这会产生一个接近但错误的输出:

# output:
/projects/bison/git//assessment/LWR/validation/HBEB

# should be:
/projects/bison/git/bison_20190827/LWR/validation/HBEP

现在,当我引用 EOF 时,我可以访问管道输入变量,但不能访问文件夹变量:

folder='
ssh $server /bin/bash << 'EOF'
ls -t /projects/bison/git |
head -1 |
awk -v folder="$folder" '{print "projects/bison/git/"$1"/assessment/LWR/validation/"folder}'
EOF
# output:
projects/bison/git/bison_20190826/assessment/LWR/validation/

# should be:
projects/bison/git/bison_20190826/assessment/LWR/validation/HBEP

有没有一种方法可以利用 heredoc 和外壳中的扩展?

【问题讨论】:

  • 您为什么不使用git 本身来跟踪您正在跟踪的内容的最新版本?
  • 即使你不使用git,无论创建一个新的bison_YYYYMMDD 目录都应该只维护一个指向最新目录的bison_current 符号链接。
  • 我们可以,但是我们的夜间测试需要很长时间,所以我们每天都会将主分支推送到我们的集群。这些测试输出我需要做一些分析的数据文件。我们不保留数据文件的版本,因为它们很大。
  • @chepner 好主意,我会和负责夜间测试的人谈谈。 (编辑:实际上我认为他们想要一个地方来保存所有夜间运行的历史,我个人认为除了对主版本进行版本控制之外没有太大区别)

标签: bash awk ssh pipe heredoc


【解决方案1】:

您可以使用未引用的 heredoc 版本。如果您想避免参数扩展,只需在$ 之前添加\

例如

folder='HBEP'
ssh $server /bin/bash << EOF
ls -t /projects/bison/git |
head -1 |
awk -v folder=$folder '{print "projects/bison/git/"\$1"/assessment/LWR/validation/"folder}'
EOF

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多