如何在awk的双引号字符串中正确使用awk变量?
在awk的system命令双引号中正确使用外部变量的问题
我懂你碰到的问题了——你已经通过-v选项把Bash变量传递给awk,但在构建system()执行的命令字符串时,直接把awk变量写在双引号里是不会被解析的,awk会把它们当成普通的字符串字面量,比如var1就会被当成字符串"var1"传给java命令,这肯定没法正常工作。
解决这个问题的核心是在awk中正确拼接字符串和变量,awk里的字符串拼接不需要任何运算符,直接把字符串部分和变量挨着写就行。这里给你两种可行的写法:
方法1:基础字符串拼接
如果你的变量值里没有空格或者特殊字符,直接这样写就可以:
memory_params="some memmory params" class_path="some class path" class_name="some class name" awk -v var1="${memory_params}" \ -v var2="${class_path}" \ -v var3="${class_name}" \ '{ cmd = "java " var1 " -cp " var2 " " var3; system(cmd); }'
这里把"java "、var1、" -cp "、var2、" "、var3直接拼接在一起,awk会自动把变量替换成实际的值,生成正确的java命令。
方法2:带引号包裹的拼接(处理含空格/特殊字符的变量)
如果你的变量值里包含空格或者特殊字符(比如路径里有空格),最好给每个变量加上双引号,避免命令执行出错,这时候需要转义双引号:
memory_params="some memmory params" class_path="some class path" class_name="some class name" awk -v var1="${memory_params}" \ -v var2="${class_path}" \ -v var3="${class_name}" \ '{ cmd = "java \"" var1 "\" -cp \"" var2 "\" \"" var3 "\""; system(cmd); }'
这里的\"是awk里的转义双引号,最终生成的cmd会是java "some memmory params" -cp "some class path" "some class name",这样就能正确处理带空格的参数了。
总结一下:awk的双引号内只会解析转义字符,不会解析变量,所以必须把变量从双引号中抽离出来,通过字符串拼接的方式组合成完整的命令字符串。
内容的提问来源于stack exchange,提问作者user3086551
相关产品推荐
相关产品推荐

