试图在EOF heredoc中使用大括号扩展

时间:2017-03-31 00:28:39

标签: bash awk eof

我正试图在EOF heredoc中使用大括号扩展。这样做有很多麻烦。我正在尝试创建一个脚本,告诉该人他们的十二生肖,并且它基于年/月/日 例如:1984年2月2日 - 1985年2月19日= RAT

awk -v year="${1}${2}${3}" '
$0 ~ year {
    print $1
    found = 1
    exit
}
END {
    if (!found)
        exit 1
}
' <<EOF
Rat 1984 1985 1996 2008 2020 2034
Ox  1985 1997 2009 2021
Tiger 1986 1998 2010 2022
Rabbit 1987 1999 2011 2023
Dragon 1988 2000 2012 2024
Snake 1989 2001 2013 2025
Horse 1990 2002 2014 2026
Goat 1991 2003 2015 2027
Monkey 1992 2004 2016 2028
Rooster 1993 2005 2017 2029
Dog 1994 2006 2018 2030
Pig 1995 2007 2019 2031
EOF

我想使用Rat 1984 {02..12} {0..31} 1985 {01,02} {0..31}来扩展我的awk来搜索提供的数字范围支撑。这可能吗? 感谢。

1 个答案:

答案 0 :(得分:1)

here documents上的Bash手册说:

  

如果 word 不加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展,忽略字符序列\newline和'\'必须用来引用字符'\','$'和'`'。

示例中的是不带引号的EOF

扩展列表不包括brace expansion;我觉得你运气不好。

  

有解决方法吗?

部分取决于您的Bash版本 - 在macOS Sierra 10.12.4上,默认值为3.2.57,它提供了Bash 4.3的不同输出。

支撑扩展是一种有限的事情 - 有许多事情是你无法做到的,因为变量直到支撑扩展发生后才会扩展。

这可能是一个暗示;不过,我不太确定你是怎么把它包含在你的剧本中的。

$ printf 'Rat %s\n' 1984{02..12}{0..31} 1985{01,02}{0..31}
Rat 198420
Rat 198421
Rat 198422
Rat 198423
Rat 198424
…
Rat 19850227
Rat 19850228
Rat 19850229
Rat 19850230
Rat 19850231
$ bash-4.3 -c "printf 'Rat %s\n' 1984{02..12}{0..31} 1985{01,02}{0..31}"
Rat 1984020
Rat 1984021
Rat 1984022
Rat 1984023
Rat 1984024
Rat 1984025
…
Rat 19850226
Rat 19850227
Rat 19850228
Rat 19850229
Rat 19850230
Rat 19850231
$

请注意,使用Bash 3.x在198420等处消失了前导零。我对第0天感到好奇,更不用说2月31日,但我认为这些将被处理。

现在,您必须决定如何将其合并到脚本中以生成数据。您可能会发现生成脚本然后运行生成的脚本的脚本比直接编写脚本更容易管理。