如何增加bash变量中的每个数字

时间:2016-12-28 00:23:06

标签: bash scripting

我有一个bash脚本来控制Linux perf。您可能知道,perf采用核心列表,可以在三种方式中的一种中指定。

  1. -C1 #core 1 only
  2. -C1-4#core 1 to 4
  3. -C1,3#core 1和3
  4. 目前,我有一个环境变量CORENO,它将控制-C $ CORENO。

    但是,我需要将CORENO偏移一个修正偏移(I.e.2)

    我能做((CORENO + = 2))但这只适用于案例1.

    是否有Linux / bash技巧允许我将修复偏移应用于bash变量中的每个数字?

3 个答案:

答案 0 :(得分: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命令进行评估。首先应用允许字符的白名单以避免任何安全问题。

答案 1 :(得分:1)

查看seq

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

答案 2 :(得分:1)

我从@that其他人那里得到了基于sed的回答,因为我比我更喜欢它,这是一个“纯粹的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的那个人更自由......