2

スクリプトを書こうとしています. このスクリプトではシェル変数を awk コマンドに渡しています. しかし実行しても何も起こりません. その行をシェルだけで実行しようとしました.私が期待したように。コードは次のとおりです。

  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/変数を使用したい場合は、2 つの選択肢があります。

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変数を適切に置換しますが、//正規表現(またはいくつかのパラメーターAFAIRawkに応じて正規表現)内では、変数を置換に使用できませんawkawk

プログラム内の変数をgrepしても問題はありませんでしたawk(単純な正規表現の場合):

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

(ここでは、と/xxx/,/yyy/の間のすべてが表示されます) (二重引用符の後に単一引用符が続くことに注意してください)xxxyyy
"/${sawk1}/,/${sawk2}/"'{print}'

これは問題なく動作し、「 awk: Using Shell Variables in Programs」から来ています。

一般的な方法は、シェル クォーティングを使用して変数の値をスクリプト内のプログラムに代入することです。
たとえば、次のプログラムを考えてみましょう。

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

awk プログラムは、プログラムを形成するために連結された 2 つの引用テキストで構成されています。

  • 最初の部分は二重引用符で囲まれているため、引用符内のパターン シェル変数を置換できます
  • 2 番目の部分は単一引用符で囲みます。

ただし、警告が追加されます。

引用による変数置換は機能しますが、面倒になる可能性があります。
シェルの引用規則 (Quoting を参照) をよく理解している必要がありプログラムを読むときに引用符を正しく一致させることはしばしば困難です。

于 2015-08-30T19:14:36.180 に答える