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
如果你不