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

如何增加bash变量中的每个数字,bash,scripting,Bash,Scripting,我有一个bash脚本来控制Linux性能。如您所知,perf采用核心列表,可以通过以下三种方式中的一种进行指定 -C1#仅适用于芯1 -C1-4#芯1至4 -C1,3#核心1和3 目前,我有一个环境变量CORENO,它将控制-C$CORENO 但是,我需要用固定偏移量(即2)偏移CORENO 我可以做((CORENO+=2))但这只适用于案例1 是否有Linux/bash技巧允许我对bash变量中的每个数字应用fix offset?请看seq for core in `seq 2 10`; do

我有一个bash脚本来控制Linux性能。如您所知,perf采用核心列表,可以通过以下三种方式中的一种进行指定

  • -C1#仅适用于芯1
  • -C1-4#芯1至4
  • -C1,3#核心1和3
  • 目前,我有一个环境变量CORENO,它将控制-C$CORENO

    但是,我需要用固定偏移量(即2)偏移CORENO

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


    是否有Linux/bash技巧允许我对bash变量中的每个数字应用fix offset?

    请看
    seq

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

    看看
    seq

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

    由于您使用的是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"
    

    它的工作原理是将所有数字替换为
    $((number+2))
    ,并将结果作为shell命令进行计算。首先应用允许字符的白名单,以避免任何安全问题。

    由于您使用的是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"
    

    它的工作原理是将所有数字替换为
    $((number+2))
    ,并将结果作为shell命令进行计算。首先应用允许字符的白名单,以避免任何安全问题。

    我对@另一个人基于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
    

    当给定非法参数时,我的函数将打印
    错误
    。来自@that other guy的答案更自由…

    我对来自@that other guy的基于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
    

    当给定非法参数时,我的函数将打印
    错误
    。来自@另一个家伙的那个更自由…

    这给了我另一个使用sed的实际例子!这给了我另一个使用sed的实际例子!