为何重复功能好像不起作用?

为何重复功能好像不起作用?
#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。因此$17并且$2ls。该函数执行:

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`是?

"$@"

$1ls$#是 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

对于生产使用,可能需要添加一些错误检查(至少有两个参数,第一个参数是一个数字,等等)。

相关内容