我正在尝试编写一个脚本,在这个脚本中我将一个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}
取代。
那么你能告诉我这里有什么问题吗?感谢。
答案 0 :(得分: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
答案 1 :(得分:0)
就像我想的那样,
awk
正确地替换变量,但在//
之间,在正则表达式(或awk
正则表达式之间,取决于某些awk
参数AFAIR ),awk
变量不能用于替换
我在awk
程序中使用变量进行grepping没有问题(对于简单的正则表达式情况):
sawk1='repo\s+module2'
sawk2='@project2\s+=\s+module2$'
awk "/${sawk1}/,/${sawk2}/"'{print}' aFile
(此处/xxx/,/yyy/
显示xxx
和yyy
之间的所有内容
(请注意双引号"/${sawk1}/,/${sawk2}/"
,然后是单引号'{print}'
)
这很好用,来自" awk: Using Shell Variables in Programs":
一种常见的方法是使用shell引用将变量的值替换为脚本内的程序 例如,请考虑以下程序:
printf "Enter search pattern: "
read pattern
awk "/$pattern/ "'{ nmatches++ }
END { print nmatches, "found" }' /path/to/data
awk程序由两段引用文本组成,这些文本连接在一起形成程序。
- 第一部分是双引号,它允许替换引号内的模式shell变量。
- 第二部分是单引号。
它确实添加了警告:
通过引用进行变量替换有效,但可能会很混乱 它需要很好地理解shell的引用规则(参见Quoting),并且在阅读程序时通常很难正确匹配引号。