在 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
我想根据另一个变量的 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