2012-12-07 63 views
-1
get_channel() 
{ 
    local wifidev="$1" 

    set -- $(iw dev "$wifidev" info) 
    # e.g. 'Interface wlan0 ifindex 6 wdev 0x2 addr 10:6f:3f:0e:31:8e type IBSS wiphy 0 channel 11 (2462 MHz) NO HT' 

    case "[email protected]" in 
     *" channel "*) 
      while [ "$1" != "channel" ]; do shift; done 
      echo "$2" 
     ;; 
     *) 
      return 1 
     ;; 
    esac 
} 

看起來很複雜。我希望在單詞「channel」後面有數字, 沒有sed或awk。有沒有可能是便攜式8-)括號膨脹到 只是有「通道」後一句話,是這樣的:在字符串中的特定單詞之後捕捉單詞並帶有-ash

channel="${@#*channel }" 
set -- $channel 
echo $1 

也許甚至有一個更好的辦法?

編輯:建議之後,我們使用這種方法現在:

set -- $(iw dev "$dev" info) 
mychan="[email protected]" 
mychan="${mychan#*channel }" 
case "$mychan" in 
    [0-9]*) 
     echo "${mychan%% *}" 
    ;; 
esac 

它是快速和安全的足夠的(+便攜式) - 但也許甚至有一個漂亮的一個?

+0

這就是相當不錯的位置參數。您需要在第二個括號擴展後刪除數字,即'channel = $ {channel %% *}'。祝你好運。 – shellter

+0

你最好做'案「$ *」在...''因爲「$ @」'擴展到多個字,並導致語法錯誤的case語句 –

+0

你是正確的(雖然在這個階段,它已經消毒 - 但它並沒有傷害更好地做到這一點) –

回答

0

這似乎並沒有做任何事情:

${@#* channel } 

我猜的特殊參數$ @是太特殊了。

存放在TMP變量第一

local tmp="$*" 
tmp=${tmp#* channel } 
if [ "$tmp" = "$*" ]; then 
    # no "channel" here 
    return 1 
fi 
echo ${tmp%% *} 
+0

奇怪的是,這不起作用:'echo「$ {tmp#* channel}」;回聲「$ {tmp%*}」'='1(2412 MHz)HT20'和'1(2412 MHz)' - 您可以證明,通過給字符串「Interface ...」輸入「tmp」 –

+0

@BastianBittorf ,第二個需要雙'%%' - 編輯答案 –

+1

POSIX.1-2008tc1將在'*'和'@'特殊字符上使用子字符串處理擴展如'$ {parameter#pattern}'的效果參數未指定。 – jilles

相關問題