shell中的倒计时,不带序号或jot

shell中的倒计时,不带序号或jot,shell,countdown,Shell,Countdown,我正在尝试制作一个倒计时脚本,该脚本以秒数为$1,然后倒计时到零,显示当前剩余的秒数 问题是,我在一个嵌入式盒子上做这件事,它没有seq或jot,我知道这两个工具可以生成我的数字列表 以下是我在普通(非嵌入式)系统上使用的脚本: 这在FreeBSD中有效。如果我在Linux机器上,我可以将的行替换为: for i in $(/usr/bin/seq ${1:-10} -1 1); do 为了同样的效果 但是如果我没有jot或seq,我该怎么办?如果您使用的是Bash,这就是您想要的: for

我正在尝试制作一个倒计时脚本,该脚本以秒数为
$1
,然后倒计时到零,显示当前剩余的秒数

问题是,我在一个嵌入式盒子上做这件事,它没有
seq
jot
,我知道这两个工具可以生成我的数字列表

以下是我在普通(非嵌入式)系统上使用的脚本:

这在FreeBSD中有效。如果我在Linux机器上,我可以将的
行替换为:

for i in $(/usr/bin/seq ${1:-10} -1 1); do
为了同样的效果


但是如果我没有
jot
seq
,我该怎么办?

如果您使用的是Bash,这就是您想要的:

for i in {1..10}
还是不狂欢?这篇文章的内容怎么样

试一试

for i in 1 10 15 20
do
   echo "do something with $i"
done
否则,如果您有最新的Solaris,至少有Bash3。例如 这给出了从1到10和15到20的范围

for i in {1..10} {15..20}
do
  echo "$i"
done
或者使用像nawk这样的工具

for i in `nawk 'BEGIN{ for(i=1;i<=10;i++) print i}'`
do
  echo $i
done

如果您使用的是Bash,这就是您想要的:

for i in {1..10}
还是不狂欢?这篇文章的内容怎么样

试一试

for i in 1 10 15 20
do
   echo "do something with $i"
done
否则,如果您有最新的Solaris,至少有Bash3。例如 这给出了从1到10和15到20的范围

for i in {1..10} {15..20}
do
  echo "$i"
done
或者使用像nawk这样的工具

for i in `nawk 'BEGIN{ for(i=1;i<=10;i++) print i}'`
do
  echo $i
done
“香草”Bourne shell的问题在于没有这样的东西;行为取决于特定的实现。大多数现代的
/bin/sh
es都有POSIX功能,但在细节上有所不同。当我进入“sh兼容”模式时,我有一个习惯,即回到真正古老的伯恩功能,这在30年前是很有用的,但在现代系统上,甚至在嵌入式系统上,这通常是过火了。:)

无论如何,这里有一个通用的倒计时循环,即使在非常旧的shell中也可以工作,但在现代bash/dash/ksh/zsh/等中仍然可以正常工作。它确实需要
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
(前两行可能只需替换为
i=${1-10}
,但一些古老的shell不喜欢对数值参数应用特殊的参数展开。)

如果系统没有
printf
,则会出现问题;只有shell内置的
echo
(或者没有内置的和一些随机选择的
/bin/echo
)实现,这两种方法都无法保证实现(回显特殊字符或阻止换行符)。您可以使用
\r
\015
获取回车。您可能需要
-e
来让shell识别这些内容(但这可能只会返回一个文本
-e
)。将文本回车放在脚本中可能会起作用,但会使维护脚本变得很痛苦

类似地,
-n
可能挤压换行符,但可能只是回显一个文本
-n
。最早使用echo压缩换行符的方法是使用换行符自然到达的特殊序列
\c
;这仍然适用于某些版本的
/bin/echo
(包括Mac OS X上的版本),或者与bash的内置echo的
-e
选项结合使用

因此,脚本中最简单的部分可能是让您接触到
awk

的部分,“香草”Bourne shell的问题是没有这样的东西;行为取决于特定的实现。大多数现代的
/bin/sh
es都有POSIX功能,但在细节上有所不同。当我进入“sh兼容”模式时,我有一个习惯,即回到真正古老的伯恩功能,这在30年前是很有用的,但在现代系统上,甚至在嵌入式系统上,这通常是过火了。:)

无论如何,这里有一个通用的倒计时循环,即使在非常旧的shell中也可以工作,但在现代bash/dash/ksh/zsh/等中仍然可以正常工作。它确实需要
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
(前两行可能只需替换为
i=${1-10}
,但一些古老的shell不喜欢对数值参数应用特殊的参数展开。)

如果系统没有
printf
,则会出现问题;只有shell内置的
echo
(或者没有内置的和一些随机选择的
/bin/echo
)实现,这两种方法都无法保证实现(回显特殊字符或阻止换行符)。您可以使用
\r
\015
获取回车。您可能需要
-e
来让shell识别这些内容(但这可能只会返回一个文本
-e
)。将文本回车放在脚本中可能会起作用,但会使维护脚本变得很痛苦

类似地,
-n
可能挤压换行符,但可能只是回显一个文本
-n
。最早使用echo压缩换行符的方法是使用换行符自然到达的特殊序列
\c
;这仍然适用于某些版本的
/bin/echo
(包括Mac OS X上的版本),或者与bash的内置echo的
-e
选项结合使用


因此,脚本中看似最简单的部分可能是让您接触到
awk

的部分。如果您的shell是bash,您可以使用以下命令从固定数字开始倒数:

#!/bin/bash

for n in {10..1}; do
  printf "\r%s " $n
  sleep 1
done
但这对您不起作用,因为bash不会处理像
{${1:-10}..1}
这样的事情,而且您已经指定了需要一个命令行选项。 当然,您也说过您没有使用bash,所以我们将假设一个更简单的shell

如果你有
awk
,你可以用它来计数

#!/bin/sh

for n in $(awk -v m="${1:-10}" 'BEGIN{for(;m;m--){print m}}'); do
  printf "\r%s " $n
  sleep 1
done
printf "\r \r"  # clean up
如果你不