我想根据另一个变量(在本例中为主题编号(的模分配一个变量,得到一个在 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