编辑——不使用 bash
$1
变量。示例使用字段指示符:$1
,$2
,$3
是awk
输入记录字段 不幸的是,我做这个例子太快了,把例子弄混了。
我相信这是一个普遍的问题。我awk
用作演示工具。目的是将 ( awk
) 脚本参数暗示到awk
(或任何工具)命令中。
我们使用从 STDIN 到提供的字段awk
来产生结果。标识符$1
, $2
,$3
是awk
来自 STDIN 流的字段。
所需的解决方案 A(首选概念),例如...
#!/bin/bash -f
# script: blue.sh
#
awk -e '{ print $1 " and " $2 " silly example" ;}'
#
以及所需的输出:
$ echo "red blue yellow" > ./blue.sh
red and blue silly example
$
备选方案 B 可能被认为是:
#!/bin/bash -f
# script: green.sh
#
wrk="awk -e '{ print \$3 \" and \" \$2 \" variable example\" ;}' "
#
echo "work is:"
echo $wrk
echo
$wrk
以及所需的输出:
$ echo "red blue yellow" > ./green.sh
wrk is:
awk -e '{ print $3 " and " $2 " variable example" ;}'
yellow and blue variable example
$
问题出在表达式的引用中-e
。
有没有办法实现这两个例子?
这可能是“我们如何运行存储在变量中的命令? ”的副本,但我会针对您的特定情况回答它,因为它有多个部分:
awk
.“在变量中运行命令”位
这是您的脚本的替代实现的建议:
运行这个:
我所做的是将
awk
命令存储在数组而不是字符串中。这确保了可以正确引用数组的每个单独元素,同时仍然保持单独的元素,与数组的其他部分分开。例如,开头的单词是与数组中的最后一个条目(即整个代码awk
)分开的一个单词。awk
当
"${wrk[@]}"
用作命令时,数组的每个元素都用作单独的命令行参数(第一个元素是命令)。扩展的引用"${wrk[@]}"
确保每个元素都被单独引用(使用${wrk[@]}
不起作用)。这就是在变量中存储和运行命令的方式,即使用数组并确保正确引用数组元素和数组的扩展。
对于
printf
shell 脚本中的调用,我使用"${wrk[*]}"
从数组中生成单个字符串wrk
(默认情况下所有元素用空格分隔)。您会注意到这不会保留对单个元素的任何引用,这是可以预料的,因为 shell 在创建数组时删除了这些元素(就像在执行类似的操作时删除了引号一样a='hello world'
)。要查看 的每个单独元素
wrk
,请改用类似的东西printf 'element: "%s"\n' "${wrk[@]}"
。这将输出在这种特殊情况下,根据您的需要,您还可以使用 shell 函数:
请注意,函数中的
$1
and$2
指的是函数的第一个和第二个参数,而不是脚本的。运行这个:
-
awk
特定位要将数据传递给
awk
我用来在命令行上-v
初始化awk
变量。awk
这比通过 shell 扩展将变量注入awk
代码更可取,因为这样做可能会允许用户注入可执行代码而不仅仅是数据(例如,通过简单地$3
包含 a;
和一些awk
代码)。有关更多信息,请参阅本网站上的“命令行参数 in awk ”和类似问题。您还可以将数据传递给
awk
使用环境变量:或者,
我也在
awk
一个BEGIN
块中执行代码,因为在标准输入上没有要读取的输入。我找到了一个解决方案,尽管结果与最初的设想完全不同。我无法找到一种方法来扩展
bash
命令中的 -script 变量,因此必须“构造”。事实证明,xargs
由于几个原因,这与 shell 想要如何做它的事情有关。我将展示一个示例运行,然后是代码并描述如何/发生了什么。我用“# (2)”之类的标签标记了要讨论的区域。
示例:
输入...
加工...
重复脚本有两个参数:
awk
命令命令行:
输出...
发生了什么?
r02/testarea
repeat
是在输入的过滤列表上重复一组命令注释代码:
备注:
$1
是命令模板。*在末尾添加一个额外的分隔符以供以后解析
$1
通常不止一个命令。将输入参数拆分为单独的分号分隔的命令字符串。ex
变量中。* 在这个例子
ex
中只是过滤器作为$2
.*
ex
成为awk
要作为选择/生成过滤器执行的命令。action
命令模板。$ff
以及命令字符串中${ff}
的语法。action
$ff
.事实证明,这变得完全不同,因为无法直接将参数注入到
awk
或模板字符串中。然而,变通方法并不太方便,并展示了它是如何在没有神秘扩展等的情况下工作的。我相信这个想法很有用。现在我发现它非常方便,因为我有一个工作片段。