“香草” Bourne shell 的问题在于没有这样的东西。行为取决于特定的实现。大多数现代/bin/sh
es 具有 POSIX 功能,但在细节上有所不同。当我进入“sh-compatibility”模式时,我习惯于回退到真正古老的 Bourne 功能,这在 30 年前很有帮助,但在现代系统甚至嵌入式系统上通常都太过分了。:)
无论如何,这是一个通用的倒计时循环,即使在非常旧的 shell 中也可以工作,但在现代 bash/dash/ksh/zsh/etc 中仍然可以正常工作。它确实需要expr
命令,这是一个非常安全的要求。
i=10
while [ $i -gt 0 ]; do
...
i=`expr $i - 1`
done
因此,如果您的嵌入式系统具有printf
,这是您的脚本,具有相同的“如果未指定参数,则默认为 10”行为:
#!/bin/sh
n=$1
i=${n-10}
while [ $i -gt 0 ]; do
printf '\r%s ' "$i"
i=`expr $i - 1`
sleep 1
done
(前两行可能可以替换为 just i=${1-10}
,但有些 - 再一次,古老的 - shell 不喜欢将特殊参数扩展应用于数字参数。)
如果系统没有printf
,那就有问题了;只有外壳的内置echo
(或没有内置和一些随机选择的实现/bin/echo
),没有保证的方法可以做这些事情(回显特殊字符或阻止换行符)。您可能可以使用\r
或\015
获取回车符。您可能需要-e
让 shell 识别那些(但这可能只是回显文字-e
)。在脚本中放置文字回车可能会起作用,但会使维护脚本变得很痛苦。
同样,-n
可能会压缩换行符,但可能只是回显文字-n
. 压缩换行符的最早方法是使用换行符自然去echo
的特殊序列;\c
这仍然适用于某些版本/bin/echo
(包括 Mac OS X 上的版本)或与 bash 的内置 echo-e
选项结合使用。
因此,脚本中看似最简单的部分可能是让您接触到awk
.