#function repeat
repeat()
{
shift
let b="$@"
for i in {1..b} ; do echo Date starting `date` ; echo Before waiting `date`; sleep 6 ; echo Done waiting `date` ; "$@" ; done
}
我第一次尝试使用这个功能时,效果非常好,但在过去的几天里,它只工作了两次,现在只工作了一次
$ repeat 7 ls
之前输出显示 7 次,后来只显示两次,现在只显示一次。
请告诉我脚本中存在什么错误,从第一天开始就从未更改过。
答案1
您没有指定脚本适用于哪种 shell。我假设它是 Bash。
您的功能repeat
定义为(从您的帖子中复制此处):
repeat()
{
shift
let b="$@"
for i in {1..b} ; do echo Date starting date ; echo Before waiting date; sleep 6 ; echo Done waiting date ; "$@" ; done
}
您正在使用 来调用它repeat 7 ls
。因此$1
是7
并且$2
是ls
。该函数执行:
shift
这会丢弃$1
,$1
变成ls
,$2
未设置且$#
为 1。
let b="$@"
b
被设定为ls
。
for i in {1..b} ; do
循环将执行一次并将i
设置为{1..b}
。(看起来您想尝试使用括号扩展来生成一些数字;也许{1..6}
看起来很相似?)
echo Date starting date
echo Before waiting date
sleep 6
echo Done waiting date ;
显示Date starting date
,,Before waiting date
等待 6 秒,最后显示Done waiting date
。也许你想要的`date`
是?
"$@"
$1
是ls
且$#
是 1;这将执行ls
。
done
循环结束for
。
一般来说,该函数将显示一条消息,等待 6 秒,显示另一条消息,然后执行名为 的命令$2
,可能将$3
, ... 作为参数传递给该命令。$1
未使用。
(我不会对这个功能过去曾做过其他事情的断言发表评论。)
工作函数定义如下:
repeat()
{
local n i
n="$1"
shift
for ((i = 1; i <= "$n"; ++i)); do
echo
"$@"
done
}
例如:
$ repeat 3 ls -F
Calibre/ Documents/ Music/ Public/ Temp/ Videos/
Desktop/ Downloads/ Pictures/ System/ Templates/ examples.desktop
Calibre/ Documents/ Music/ Public/ Temp/ Videos/
Desktop/ Downloads/ Pictures/ System/ Templates/ examples.desktop
Calibre/ Documents/ Music/ Public/ Temp/ Videos/
Desktop/ Downloads/ Pictures/ System/ Templates/ examples.desktop
对于生产使用,可能需要添加一些错误检查(至少有两个参数,第一个参数是一个数字,等等)。