可以,但最佳做法是使用 awk 方式将变量传递给 awk。
使用 shell 脚本变量的示例
awk -v awkVar1="$scriptVar1" -v awkVar2="$scriptVar2" '<your awk code>'
使用环境变量的示例
awk -v awkVar1=ENVIRON["ENV_VAR1"] -v awkVar2=ENVIRON["ENV_VAR2"] '<your awk code>'
可以同时使用脚本和环境变量
awk -v awkVar1=ENVIRON["ENV_VAR1"] -v awkVar2="$scriptVar2" '<your awk code>'
您可能会发现 bash 技巧来规避 awk 的做法,但这并不安全。
说明和更多示例
Awk 以这种方式工作,因为它本身就是一种编程语言,并且有自己的方式在 awk 语句中使用变量。
“inside”是指单引号之间的部分。
让我们看一个示例,我们在配置文件中关闭 DHCP,所有这些都使用 shell 脚本使用变量完成。我将解释最后一行代码。
脚本不是最优的,它的主要目的是使用脚本变量。解释脚本是如何工作的超出了这个答案的范围,重点是解释变量的使用。
#!/bin/bash
# set some variables
# set path to the config file to edit
CONFIG_FILE=/etc/netplan/01-netcfg.yaml
# find the line number of the line to change using awk and assign it to a variable
DHCP_LINE=$(awk '/dhcp4: yes/{print FNR}' $CONFIG_FILE)
# get the number of spaces used for identation using awk and assign it to a variable
SPACES=$(awk -v awkDHCP_LINE="$DHCP_LINE" 'FNR==awkDHCP_LINE {print match($0,/[^ ]|$/)-1}' $CONFIG_FILE)
# find DHCP setting and turn it off if needed
awk -v awkDHCP_LINE="$DHCP_LINE" -v awkSPACES="$SPACES" 'FNR==awkDHCP_LINE {sub("dhcp4: yes", "dhcp4: no")}' $CONFIG_FILE
让我们把最后一行分解成几段来解释。
awk -v awkDHCP_LINE="$DHCP_LINE" -v awkSPACES="$SPACES"
上面这部分将DHCP_LINE脚本变量的值赋给awkDHCP_LINEawk变量,将SPACES脚本变量的值赋给awkSPACESawk变量。
请注意,SPACES 变量被传递给 awk 只是为了展示如何传递多个变量; awk 命令不处理它。
'FNR==awkDHCP_LINE {sub("dhcp4: yes", "dhcp4: no")}'
上面这个是 awk 的“inside”部分,可以使用传递给 awk 的变量。
$CONFIG_FILE
这部分是outside awk,一个通用的脚本变量用来指定要处理的文件。
我希望这能澄清一些事情:)
注意:如果您有很多变量要传递,@potong 提供的解决方案可能会证明是更好的方法,具体取决于您的用例。