在 bash 中使用 OR

Use of OR in bash

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

换句话说,我想要一些与 modular 函数 a%n 非常相似的东西,但是对于 n 的完整倍数,我想要 return n,而不是 0.

我认为最简单的方法是使用 or 条件,这样如果 mod 函数 returns 0,N 将被 returned,但我无法使语法正常工作。

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

只是 returns subj%4 的结果,并忽略了条件,同时用 -o 替换 || 失败。

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

我错过了什么?

是的,你的想法是对的,你只是将块放在用于 运行 C 风格算术运算的构造中,即使用 Arithmetic expressions 运算符

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

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

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

根据需要将此函数修改为return自定义值。


modulo 5
0    
modulo 4
4    
modulo 8
4
modulo
bash: 1: Needs an argument

在bash中,你的||表示:"If $((subj%4)) returns non-zero, do 4"。

它不会工作,至少因为 $((subj%4)) returns 零(退出代码,我是说)。

在你的情况下,做类似的事情:

subj=4
list=$((subj%4))
if [ "${list}" -eq 0 ]
then
    echo "4"
else
    echo "${list}"
fi

这是一个没有分支的版本:

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

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

示例:

cycle() { 
    n=; m=; 
    $(( 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