我需要将命令分配给变量,并在 Linux Bash 中使用变量执行该命令。由于有多个引号,该命令在命令行中执行正常,但在变量中执行不正常。我希望对多个引号使用反斜杠以避免错误。请帮助提供正确的格式。
代码:
parm="cat file|awk '$1>0 && $1="abc" {print f $0} {f=$0 ORS}'"
eval "$parm"
内容:
abc
123
efg
456
错误:
awk: cmd. line:1: >0 && =abc {print f bash} {f=bash ORS}
awk: cmd. line:1: ^ syntax error
提前致谢!
要存储代码,请使用函数,而不是变量:
如果必须使用变量:
可能是最简单的,我们只使用单引号,并且要插入单引号,我们需要去掉引号并用 引用单引号
\'
。参见:
当分隔符被引号括起来时
<< 'delimiter'
,此处的文档中就没有$param
、$(( arith ))
、也没有行延续`cmdsubst`
,这使得编写包含任何内容的多行文本变得容易。$(cmdsubst)
\
我已将(对于合并单个文件
cat file |
来说意义不大)替换为,将赋值移出容易混淆的情况,并根据 POSIX 的要求在两个语句之间添加了分隔符(这里是换行符,也提高了可读性) 。cat
< file
$1 = "abc"
awk
使用函数还意味着它可以像下面这样参数化:
其中第一个参数是标准输入
awk
或:其中所有参数均作为文件路径(如果
-
未提供任何参数或则为 stdin)并连接起来,并且结果awk
通过管道作为 stdin 提供:所有参数都传递给
awk
可以将它们作为文件路径、stdin 为-
¹(或者如果没有文件路径参数)或 awk 变量分配²³。¹用于当前工作目录中
./-
实际调用的文件-
² 用于在当前工作目录中
./foo=bar.txt
直接调用的文件。foo=bar.txt
³ 请注意,在 GNU
awk
aka中gawk
,new=@/text/
被解释为new=text
作为text
正则表达式。new='\@/text/'
可以解决这个问题,但会发出警告,解决该缺陷的更好方法是调用awk
as ,POSIXLY_CORRECT=1 awk ...
这会为 gawk 禁用该缺陷,并且对其他实现应该是无害的awk
。