在 bash 中使用 OR



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

换句话说,我想要一些与模函数a%n非常相似的东西,但对于n的全倍数,我想返回n,而不是0

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

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

只返回 subj%4 的结果,并忽略条件,而将 || 替换为 -o 失败。

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

我错过了什么?

是的,你的想法是对的,你只是把块放在用于运行 C 风格算术运算的结构中,即使用算术表达式运算符

((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

在 bash 中,您的||表示:"如果$((subj%4))返回非零,则执行4"。

它不起作用,至少因为$((subj%4))返回零(我的意思是退出代码(。

在您的情况下,请执行类似操作:

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

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

$((  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

相关内容

  • 没有找到相关文章

最新更新