Перейти к началу цикла в bash

Итак, сегодня я получил этот вывод из DNF при запуске dnf check-update :

Fedora 25 - x86_64 - Обновления
4,6 МБ/с | 23 МБ 00:05 Последняя проверка срока действия метаданных: 0:00:08 назад, суббота, 27 мая, 06:54:17 2017.

dhcp-client.x86_64
12:4.3.5-2.fc25 обновления dhcp-common.noarch
12:4.3.5-2.fc25 обновления dhcp-libs.x86_64
12:4.3.5-2.fc25 обновления gtk-update-icon-cache.x86_64
3.22.15-2.fc25 обновляет gtk3.x86_64
3.22.15-2.fc25 обновляет julietaula-montserrat-fonts.noarch <-----Пакет есть

1:6.002-2.fc25 обновляет libinput.x86_64
1.6.3-5.fc25 обновляет libsmbclient.x86_64
2:4.5.10-0.fc25 обновления libwbclient.x86_64
2:4.5.10-0.fc25 обновления кислород-значок-тема.noarch
1:5.34.0-1.fc25 обновления p11-комплект.i686
0.23.2-4.fc25 обновляет p11-kit.x86_64
0.23.2-4.fc25 обновляет p11-kit-trust.x86_64
0.23.2-4.fc25 обновляет samba-client.x86_64
2:4.5.10-0.fc25 обновления самба-клиент-libs.x86_64
2:4.5.10-0.fc25 обновления самба-common.noarch
2:4.5.10-0.fc25 обновления общие библиотеки самбы.x86_64
2:4.5.10-0.fc25 обновления vte-профиль.x86_64
0.46.2-1.fc25 обновляет vte291.x86_64
0.46.2-1.fc25 обновляет устаревшие пакеты julietaula-montserrat-fonts.noarch
1:6.002-1.fc25 @обновления julietaula-montserrat-fonts.noarch 1:6.002-1.fc25 @updates julietaula-montserrat-fonts.noarch
Обновления 1:6.002-2.fc25 julietaula-montserrat-fonts.noarch 1:6.002-1.fc25 @updates

Это произошло через неделю после появления сообщения «julietaula устаревший пакет». Затем я запустил dnf update, и пакет был обновлен, и я больше не получаю сообщение об устаревании.

Это заняло некоторое время, но DNF автоматически разобрался.

0
01.04.2017, 00:51
2 ответа

Если вы хотите перейти к следующему запросу, используйте оператор continue.

Если вы хотите повторить тот же запрос, используйте цикл. Вы хотите повторить запрос, поэтому напишите сценарий, который делает это, а не маскируйте свое намерение низкоуровневой конструкцией, которой даже не существует в используемом вами языке.

for i in /apps/incoming/*.sql
do
  while
    j=$(…)
    …
    ! echo "${tmprnt}" | grep "${searchString1}" 1>/dev/null 2>&1
  do
    … # whatever you want to do when $tmprnt has the right format
  done
done

Я исправил условный оператор, который вы написали, на то, что вы, вероятно, имели в виду — выполнение вывода grep как фрагмента оболочки не имеет смысла. Также не забудьте заключить в двойные кавычки переменные и подстановки команд.

Обратите внимание на логику: пока строка поиска отсутствует, повторить запрос.

Этот сценарий будет зацикливаться на базе данных, так что чего-то здесь не хватает (надеюсь, кода, который вы просто пропустили, чтобы не усложнять вопрос).

3
28.01.2020, 02:19

Да, есть способ, но вы никогда не должны использовать его в новом сценарии, который вы разрабатываете, потому что это всего лишь обходной путь.

Однако, когда я перешел с Windows на Linux на своем рабочем столе, мне нужно было преобразовать множество пре-существующих .BATи .CMDфайлов, и я не собирался переписывать для них логику, поэтому Я нашел способ сделать gotoв bash, который работает, потому что goto functionзапускает sedсам по себе, удаляя любые части сценария, которые не должны выполняться,а потом все оценивает:

#!/bin/bash

# BAT / CMD goto function
function goto
{
    label=$1
    cmd=$(sed -n "/^:[[:blank:]][[:blank:]]*${label}/{:a;n;p;ba};" $0 | 
          grep -v ':$')
    eval "$cmd"
    exit
}

apt update

# Just for the heck of it: how to create a variable where to jump to:
start=${1:-"start"}
goto "$start"

: start
goto_msg="Starting..."
echo $goto_msg
# Just jump to the label:
goto "continue"

: skipped
goto_msg="This is skipped!"
echo "$goto_msg"

: continue
goto_msg="Ended..."
echo "$goto_msg"

# following doesn't jump to apt update whereas original does
goto update

и я совсем не чувствую себя виноватым, как сказал Линус Торвальдс:

From: Linus Torvalds
Subject: Re: any chance of 2.6.0-test*?
Date: Sun, 12 Jan 2003 11:38:35 -0800 (PST)

I think goto's are fine, and they are often more readable than large amounts of indentation. That's especially true if the code flow isn't actually naturally indented (in this case it is, so I don't think using goto is in any way clearer than not, but in general goto's can be quite good for readability).

Of course, in stupid languages like Pascal, where labels cannot be descriptive, goto's can be bad. But that's not the fault of the goto, that's the braindamage of the language designer.

Исходный код кода(изменен, чтобы сделать его менее подверженным ошибкам)
Источник цитаты

1
28.01.2020, 02:19

Теги

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