代码之家  ›  专栏  ›  技术社区  ›  Henry Brice

在bash中使用或

  •  3
  • Henry Brice  · 技术社区  · 7 年前

    我想根据另一个变量(本例中为主题编号)的模分配一个变量,得到一个在N个条件上循环的数字(代表主题条件)。

    换句话说,我想要一些非常类似于模块化函数的东西 a%n ,但对于 n 我想回来 n 而不是 0 .

    我认为最简单的方法是使用or条件,这样如果mod函数返回0,则会返回N,但我无法使用语法。

    subj=4
    list=$((subj%4)) || 4
    echo $list
    

    只返回 subj%4 ,并忽略条件,而替换 || 具有 -o 失败。

    如果我尝试在整个测试中使用括号,我只会得到条件测试的二进制输出。

    我错过了什么?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Inian    7 年前

    是的,您的想法是正确的,您只需将块放入用于运行C风格算术运算的构造中,即使用 Arithmetic expressions 操作人员

    ((list = n%4==0 ? 4 : 0 ))
    

    按照OP的要求分别使用变量和函数

    modulo() {
        local n="${1?Needs an argument}"
        echo $((n%4==0 ? 4 : 0 ))
    }
    

    修改此函数以根据需要返回自定义值。


    modulo 5
    0    
    modulo 4
    4    
    modulo 8
    4
    modulo
    bash: 1: Needs an argument
    
        2
  •  1
  •   Viktor Khilin    7 年前

    在bash中 || 表示:“如果 $((subj%4)) 返回非零,do 4 ".

    这行不通,至少因为 $((科目%4)) 返回零(我的意思是退出代码)。

    在您的情况下,可以这样做:

    subj=4
    list=$((subj%4))
    if [ "${list}" -eq 0 ]
    then
        echo "4"
    else
        echo "${list}"
    fi
    
        3
  •  1
  •   olivecoder    7 年前

    以下是一个没有分支的版本:

    $((  1 + (n + m - 1)  % m ))
    

    我怀疑分支在bash脚本中是一个问题,但这在其他情况下可能有用。

    例子:

    cycle() { 
        n=$1; m=$2; 
        $(( 1 + (n + m - 1)  % m )) 
    } 
    
    for ((i=0; i<10; i++)); do echo $i: $(cycle $i 4); done
    

    输出:

    0: 4
    1: 1
    2: 2
    3: 3
    4: 4
    5: 1
    6: 2
    7: 3
    8: 4
    9: 1