我想将awk命令存储在一个变量中,以便稍后在自动脚本中使用。
如何在变量中存储命令?
AUTO_SCRIPT="cp a b"
如何运行存储的命令?
$AUTO_SCRIPT
现在,我要在此脚本中存储awk命令:
awk -v par="eth0" '/^iface/ && $2==par {print}' /etc/network/interfaces
(此awk通常会打印类似iface eth0 inet dhcp的内容。
所以我想把它存储起来以便以后执行:
AUTO_SCRIPT="awk -v par="eth0" '/^iface/ && $2==par {print}' /etc/network/interfaces"
但是,在尝试执行时:
$AUTO_SCRIPT
awk: cmd. line:1: '/^iface/
awk: cmd. line:1: ^ invalid char ''' in expression
我试过什么?几乎所有的事情。用字符转义撇号。使用Qoute字符而不是撇号。尝试使用(和)字符等。没有效果。
我需要一些好主意。
参见bashfaq 50:我试图在变量中放置一个命令,但是复杂的情况总是失败的!正如它所说,"变量保存数据。函数保持代码。不要把代码放在变量中!"根据您实际尝试完成的工作,常见问题解答中列出了许多备选方案。
摆脱使用所有大写字母的习惯。太容易覆盖敏感变量,如path。
另请参见pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,第四段,建立环境和shell变量所用的所有caps名称,这些变量对shell或posix定义的工具有意义,并为应用程序保留至少一个小写字符的名称:为自己的变量使用小写名称不仅仅是一个好方法。想法,它实际上被供奉在POSIX中。
不要将命令保存在变量中,没有理由这样做,因为这样做既笨拙又容易出错。只需创建一个调用awk脚本的shell函数。例如($是我的提示):
$ auto_script() { echo 'hello world'; }
$ auto_script
hello world
只需对awk脚本执行相同的操作:
auto_script() { awk -v par='eth0' '/^iface/ && $2==par' /etc/network/interfaces; }
将命令放入函数中是最干净的解决方案。另一种解决方案是将命令放入数组中。
auto_script=( awk -v par="eth0" '/^iface/ && $2==par {print}' /etc/network/interfaces )
然后像这样执行
"${auto_script[@]}"
请阅读提供给您的bashfaq 50链接。
除非使用其他类似于数组的机制,否则看起来您不能这样做。
当调用$AUTO_SCRIPT时,shell按空白分割内容,产生以下参数:awk、-v、par=\"eth0\"、'/^iface/、&&、$2==par、{print}'、/etc/network/interfaces。因此,awk(1)无法运行正确的程序,因此会出现错误。
阅读问题注释中的bash faq链接。
@格伦纳扎克曼谢谢。我没有考虑过阵列;)