2012-06-21 56 views
0

我想把接口每隔1秒鐘上下80次,我怎樣才能通過bash腳本來實現呢?如何在Bash循環中每秒切換一個接口?

這樣的事情?

COUNT = 80 
for n in $(seq -w 1 $COUNT); do 
    case $n in 
    [1,3,5,7,9....79]*) # I don't know how to represent the odd value only 
     ifconfig veth1 down 
     sleep 1 
     ;; 
    [2,4,6,8,10....80]*) 
     ifconfig veth1 up 
     sleep 1 
     ;; 
    esac 
done 
+0

你試過了嗎?它有用嗎?如果不是,你會得到什麼錯誤?如果有的話,預期和實際產出是多少?請相應地編輯您的問題。 –

回答

3
COUNT=40 
for n in $(seq -w 1 $COUNT); do 
    ifconfig veth1 down 
    sleep 1 
    ifconfig veth1 up 
    sleep 1 
done 

或者,如果你真的想數到80:

COUNT=80 
for n in $(seq -w 1 $COUNT); do 
    case $n in 
    *[13579]) 
    ifconfig veth1 down 
    ;; 
    *) 
    ifconfig veth1 up 
    ;; 
    esac 
    sleep 1 
done 
+0

+1,不需要使用case語句。 – chepner

2

使用%運算符。像下面,你要

count=0 
while [ $count -lt 80 ] 
do 
    if (($count % 2 == 0)) 
    then 
     echo 'aaa' 
    else 
     echo 'bbb' 
    fi 

    count=$(($count + 1)) 
done 
+1

'while((count <80))'和'((count ++))'但你真的不願讓Bash維持櫃檯嗎? '((count = 0; count <80; count ++))' –

0

如果你不介意的bash化,可以使你的代碼更通過使用Bash中可用的各種擴展的更簡潔替換命令的回聲。例如:

for i in {1..80}; do 
    case $((i % 2)) in 
     0) ifconfig veth1 down ;; 
     1) ifconfig veth1 up ;; 
    esac 
    sleep 1 
done 

這裏的魔術是{1..80}序列表達,加上模運算符,以確定該號碼是否是奇數還是偶數。如果您的Bash版本因任何原因不支持序列表達式,請改爲使用$(seq 1 80)

+0

序列表達式在8年前的Bash 3中引入。 –

+0

@DennisWilliamson你是對的......它是在Bash中添加的序列表達式*增量*。因爲我的示例不使用序列增量,所以我會更新答案。 –

+0

序列表達式雖然不錯,但它們似乎無法使用變量。那就是'c = 4; echo {1.. $ c}'不會返回'1 2 3 4',而是'{1..4}'。你需要''評估'這個擴大它。如果'eval'就是答案.....無論如何,+1('$((i%2))'),而'{1..80}'爲-1,因爲靈活性的喪失。 – Graham

3

切換標誌:

#!/bin/bash 
for ((i = 1, flag = 0; i <= 80; i++)) 
do 
    if ((flag ^= 1)) 
    then 
     ifconfig veth1 down # odd 
    else 
     ifconfig veth1 up 
    fi 
    sleep 1 
done 
+0

+1用於在shell腳本中查找*按位異或*的用法。 –