将shell变量传递给mktime awk命令

时间:2014-01-09 18:39:44

标签: shell

你能用这个脚本帮我吗?

#!/bin/bash
data=`date '+%Y %m %d'`
data2=" 7 0 0"
string=$data$data2
awk -v str=$string '{print mktime("str");}'

我得到了这个输出:

awk: cmd. line:1: fatal: cannot open file `09' for reading (No such file or directory)

3 个答案:

答案 0 :(得分:2)

你不应该在awk中引用str,否则它被视为文字字符串。您还必须正确引用shell变量。

#!/bin/bash

data=$(date '+%Y %m %d')
data2=" 7 0 0"
string="$data$data2"

awk -v str="$string" 'BEGIN {print mktime(str)}'

答案 1 :(得分:0)

@anubhava有正确的答案。原因如下:在变量替换之后,shell会在代码中看到这一行:

awk -v str=2014 01 09 7 0 0 '{print mktime("str");}'

因此,您将“2014”作为“str”变量传递,您的awk脚本为“01”(这是一个有效的awk程序,将打印每一行),并传递文件参数“09”,“ 7“,...因此错误”无法打开文件`09'进行阅读“

课程:在shell脚本编写中,除非您知道何时不要,始终引用您的"$variables"

答案 2 :(得分:0)

你想要这个:

div[@class="price"]

span[@class="originalRetailPrice"]行的另一种替代方法是:(这样做的好处是可以处理缺少#!/bin/bash data="`date '+%Y %m %d'`" data2=" 7 0 0" string="$data$data2" awk -v str="$string" 'BEGIN {print mktime(str);exit;}' 选项的旧awk版本,例如Solaris 10 awk(他们往往会错过-v))

/usr/bin/awk

需要BEGIN块才能使mktime在启动时运行代码而不是每个输入行。

在等待输入之前需要awk "BEGIN {print mktime(\"$string\");exit;}" 才能退出。 (似乎没有它在GAWK上工作)

需要引号将变量作为单个条目传递... This overview of shell quoting对于尝试shell脚本的任何人来说都是重要的读物......

需要省略awk代码中的引号以获取awk以使用变量exit而不是字符串awk

您可能还想用str替换反引号(``),在复杂的嵌套情况下读取更容易,并且在所有现代shell中都支持(看起来它可能在POSIX标准中) ,我没有检查过......)..(虽然这不会影响代码)