2

我正在尝试编写一个脚本,在这个脚本中,我将一个 shell 变量传递给一个 awk 命令,但是当我运行它时没有任何反应,我试图只在 shell 中运行该行,我发现没有发生变量扩展就像我预期的那样。这是代码:

  1 #!/bin/bash
  2 
  3 # Created By Rafael Adel
  4 
  5 # This script is to start dwm with customizations needed
  6 
  7 
  8 while true;do
  9         datestr=`date +"%r %d/%m/%Y"`
 10         batterystr=`acpi | grep -oP "([a-zA-Z]*), ([0-9]*)%"`
 11         batterystate=`echo $batterystr | grep -oP "[a-zA-Z]*"`
 12         batterypercent=`echo $batterystr | grep -oP "[0-9]*"`
 13 
 14         for nic in `ls /sys/class/net`
 15         do
 16                 if [ -e "/sys/class/net/${nic}/operstate" ]
 17                 then
 18                         NicUp=`cat /sys/class/net/${nic}/operstate`
 19                         if [ "$NicUp" ==  "up" ]
 20                         then
 21                                 netstr=`ifstat | awk -v interface=${nic} '$1 ~ /interface/ {printf("D: %2.1fKiB, U: %2.1fKiB",$6/1000, $8/1000)}'`
 22                                 break
 23                         fi
 24                 fi
 25         done
 26 
 27 
 28         finalstr="$netstr | $batterystr | $datestr"
 29 
 30         xsetroot -name "$finalstr"
 31         sleep 1
 32 done &
 33 
 34 xbindkeys -f /etc/xbindkeysrc
 35 
 36 numlockx on
 37 
 38 exec dwm

这一行:

netstr=`ifstat | awk -v interface=${nic} '$1 ~ /interface/ {printf("D: %2.1fKiB, U: %2.1fKiB",$6/1000, $8/1000)}'`

是什么导致netstr变量根本没有被分配。那是因为interface不替换为${nic}我猜。

那么你能告诉我这里有什么问题吗?谢谢。

4

2 回答 2

2

如果你想/grep/使用你的变量,你有两个选择:

interface=eth0
awk "/$interface/{print}"

或者

awk -v interface=eth0 '$0 ~ interface{print}'

请参阅http://www.gnu.org/software/gawk/manual/gawk.html#Using-Shell-Variables

于 2013-06-30T21:03:30.160 回答
2

就像我想的那样,awk正确替换变量,但是在//正则表达式(或awk正则表达式,取决于某些awk参数 AFAIR)之间,awk变量不能用于替换

我在程序中使用变量没有问题awk(对于简单的正则表达式案例):

sawk1='repo\s+module2' 
sawk2='@project2\s+=\s+module2$'
awk "/${sawk1}/,/${sawk2}/"'{print}' aFile

(此处/xxx/,/yyy/显示 和 之间的所有内容xxxyyy
注意双引号"/${sawk1}/,/${sawk2}/",后跟单引号'{print}'

这很好用,来自“ awk:在程序中使用 Shell 变量”:

一种常见的方法是使用 shell 引用将变量的值替换到脚本内的程序中。
例如,考虑以下程序:

printf "Enter search pattern: "
read pattern
awk "/$pattern/ "'{ nmatches++ }
     END { print nmatches, "found" }' /path/to/data

awk 程序由两段引用的文本组成,它们连接在一起形成程序。

  • 第一部分是双引号,允许替换引号内的模式 shell 变量
  • 第二部分是单引号。

它确实添加了警告:

通过引用进行变量替换是可行的,但可能会很混乱。
它需要对 shell 的引用规则有很好的理解(请参阅引用),并且在阅读程序时通常很难正确匹配引号。

于 2015-08-30T19:14:36.180 回答