Почему повторная функция, кажется, не работает?

#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  
}  

В первый раз, когда я пытался использовать эту функцию, она работала великолепно, затем за прошедшие несколько дней, она работала 2 раза затем своя работа только однажды теперь

$ repeat 7 ls

вывод раньше показывал в 7 раз ранее, затем он показал его только дважды, теперь его проявление вывода только однажды.
Сообщите мне, какая ошибка находится там в сценарии, который никогда не изменялся с первого дня.

-1
задан 4 December 2016 в 10:44

1 ответ

Вы не указывали для того, какая оболочка является предназначенным сценарием. Я предположу, что это - 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

Поскольку производство использует некоторую проверку ошибок, вероятно, придется добавить (существует по крайней мере два аргумента, первым аргументом является число, и т.д.).

1
ответ дан 28 September 2019 в 01:57

Другие вопросы по тегам:

Похожие вопросы: