【发布时间】:2012-01-09 18:11:29
【问题描述】:
我正在编写一个 sh 脚本,在该脚本中,我处于 WHILE 循环中,每次迭代都会增加一个变量,并且我想每五次迭代保存一个文件。
我通常会做的(比如在 C 中)会做一个if ( n % 5 == 0) 测试,但我不知道这是否可能在这里..?如果不是,有没有人有任何想法可以完成这项工作?
干杯!
【问题讨论】:
我正在编写一个 sh 脚本,在该脚本中,我处于 WHILE 循环中,每次迭代都会增加一个变量,并且我想每五次迭代保存一个文件。
我通常会做的(比如在 C 中)会做一个if ( n % 5 == 0) 测试,但我不知道这是否可能在这里..?如果不是,有没有人有任何想法可以完成这项工作?
干杯!
【问题讨论】:
现在认为反引号已弃用 (many further notes),因此我建议切换到 $(( ... )) 或 $( ... ) 构造。
expr (man page) 和 bc (man page) 都是外部命令,因此在比我的示例或上述示例更复杂的示例中会导致一些可测量的减速。此外,已经有一种方法可以轻松避免它们(两者)。此外,默认情况下,它们可能并非在所有系统上都可用。
(在某些情况下可能不完美,我只是测试了基本场景。)
用于测试数字的奇数(例如)的最简单但可移植且符合 POSIX 的正确代码(无 Bashisms (Greg's Wiki on how to re-write Bash snippets to POSIX); (Wikipedia overview on POSIX))如下:
#!/bin/sh
n=10
if [ $(( n % 2 )) -eq 0 ]; then
printf '%s\n' "Number $n is Even"
else
printf '%s\n' "Number $n is Odd"
fi
当然,您可以在那里测试任何模,而不仅仅是一个数字是偶数/奇数。
【讨论】:
如果你的 sh 真的是 sh 而不仅仅是 bash 作为 sh 运行,那么这将正常工作
if [ `expr $n % 5` -eq 0 ]
then
# do something
fi
如果你的 sh 真的是 bash,那么把你的测试放在 (( )) 像这样
if (( $n % 5 == 0 ))
then
# do something
fi
【讨论】:
-12 mod 10 在数学上是 8,但 bash 会将其计算为 -2。你可以用简单的echo $((-12 % 10)) (-2) 测试它,并与python3 python3 -c "print(-12 % 10)" (8) 进行比较。
在 shell 中做数学时应该使用 bc
if [ `echo "3 % 2" | bc` -eq 0 ]
【讨论】:
bc