从变量执行命令

时间:2015-10-18 21:00:07

标签: regex bash shell awk

在此Awk doesn't match all match all my entries的延续中,我现在正在尝试编写一个脚本以在不同的机器上执行此操作。在脚本中,如果存在其他常规awk,我想运行/ usr / xpg4 / bin / awk。 我不能做一个简单的if else因为我的脚本太复杂了 - 我不想做一些用户友好的事情,它有一些选择。 所以我在这样的变量中记录了正确的awk:

command='awk '"'"'match($0,/^[[:alpha:]_][[:alnum:]_]*\**[[:space:]]+[[:alpha:]_][[:alnum:]_]*[[:space:]]*\([^)]*\)/) { print substr($0,RSTART,RLENGTH) ";\n" }'"'";

在我尝试执行之后

  

code = $($ command $ file);

我收到此错误:

awk: command line:1: 'match($0,/^[[:alpha:]_][[:alnum:]_]*\**[[:space:]]+[[:alpha:]_][[:alnum:]_]*[[:space:]]*\([^)]*\)/)
awk: command line:1: ^ bad character « ' » in expression

如果我把它们拿走,这没有任何意义......

1 个答案:

答案 0 :(得分:0)

粗略地说,不要这样做。

AWK=/usr/xpg4/bin/awk
if [ ! -x "$AWK" ]
then AWK="awk"
fi

然后你可以使用:

code=$("$AWK" '…your awk script…' "$file")

或者您可以将脚本放入文件script.awk,然后使用:

code=$("$AWK" -f script.awk "$file")

我们可以围绕使用"$AWK"来讨论双引号的优点;有利有弊。

如果您需要针对(Solaris?)awk的不同子类别使用不同的awk脚本,那么您可以创建不同的script.awk文件,并且仍然使用{{{1}的通用表示法1}}执行脚本。

并且没有义务使用-f script.awk这个名字;这只是说明性的。实际上,如果您在运行中创建它,则应确保它具有唯一名称(例如,通过将当前进程ID script.awk添加到名称中)。注意安全问题。我不确定Solaris是否附带$$命令来安全地创建临时文件。