2016-12-28 80 views
0

我有一個bash腳本來控制Linux perf。正如你可能知道的那樣,perf可以用三種方式中的一種來指定核心列表。如何增加bash變量中的每個數字

  1. -C1 #core 1只
  2. -C 1-4#芯1至4
  3. -C1,3#芯1和3

目前,我有一個環境變量科雷諾這將控制-C $ CORENO。

不過,我需要通過一個固定偏移(IE2)來抵消科雷諾

我可以做((科雷諾+ = 2)),但情況1.

,只有工作是否有一個Linux/bash技巧允許我應用修正偏移到bash變量中的每個數字?

回答

3

既然你是在Linux上,這裏的一些GNU sed的:

addtwo() { 
    sed -re 's/[^0-9,-]//g; s/[0-9]+/$((\0+2))/g; s/^/echo /e;' <<< "$1" 
} 

addtwo "1" 
addtwo "1-4" 
addtwo "3,4,5" 

這將輸出:

3 
3-6 
5,6,7 

它通過更換所有數字都與$((number+2))相同,並將結果評估爲shell命令。首先應用白名單允許的字符以避免任何安全問題。

+0

這給了我另一個使用sed的實際例子! – Patrick

1

看看seq

for core in `seq 2 10`; do 
    echo CORENO=$core 
done 
1

我已經提出了基於sed的答案@ that其他人,因爲我比我更喜歡它,這是一個「純粹的bash」解決方案,由遞歸函數組成。

function increment() { 
    local current="$1" n=$(($2)) 
    if [[ "$current" =~ ^[0-9]+$ ]]; then 
     echo $((current+n)) 
    elif [[ $current == *,* ]]; then 
     echo $(increment ${current%%,*} $n),$(increment ${current#*,} $n) 
    elif [[ $current == *-*-* ]]; then 
     echo ERROR 
    elif [[ $current == *-* ]]; then 
     echo $(increment ${current%-*} $n)-$(increment ${current#*-} $n) 
    else 
     echo ERROR 
    fi 
} 

CORENO=3-5 
CORENO=$(increment $CORENO 2) 
echo $CORENO 

increment 3-5,6-8 3 

當給出非法參數時,我的函數將打印ERROR。 @that其中一個人更自由...

+0

謝謝!我今天學到了一些新東西:) – Patrick

相關問題