Что можно добавить к этому простому сценарию цикла while?

Это случилось со мной, когда я инициализировал коробку Vagrant, которая использовала Debian "Jessie".

Следуя ответу Стивена Китта , переход на archive.debian.org у меня сработал, но мне пришлось добавить его в /etc/apt/sources.list.d/jessie-backports.list, а не в /etc/apt/sources.list.

Я добавил следующую строку вprovision.sh:

echo "deb http://archive.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list

Затем я также получил ошибку безопасности apt-get update.

В соответствии с Как обойти проблему «Срок действия файла с истекшим сроком действия» на локальном зеркале , это устранило эту ошибку:

apt-get -o Acquire::Check-Valid-Until=false update

В качестве альтернативы, чтобы навсегда отключить проверки, добавьте это вprovision.sh:

echo "Acquire::Check-Valid-Until \"false\";" > /etc/apt/apt.conf.d/100disablechecks

Затем вы можете выполнять все команды aptбез флага -o.

-1
12.05.2020, 20:50
2 ответа

Обратите внимание, как заканчивается ваш цикл, если пользователь вводит строку red? Это означает, что когда цикл закончится, $favoriteбудетred(или пользователь нажмет Ctrl+D и $favoriteбудет пустым ).

Самое простое изменение, которое вы могли бы внести в свой код (, игнорируя возможность выхода из цикла с помощью Ctrl+D ), заключалось бы в выводе строки в конце скрипта:

#!/bin/sh

printf 'What is my favorite color? ' >&2
read favorite
while [ "$favorite" != "red" ]; do
echo "Nope, try again."; read favorite
done

echo "That's right!"

Я также покончил с echo -nи заменил его более стандартным вызовом printf, который дополнительно печатает стандартную ошибку (как подсказки, которые должны быть напечатаны ). Если вы используете bash, вы можете использовать read -p 'Enter color: ' color, чтобы задать пользователю вопрос и прочитать цвет за один раз.

Если вы хотите решить эту проблему правильно, выполните цикл с проверкой ввода, как это обычно делается:

#!/bin/sh

while true; do
    printf 'Enter color: ' >&2
    read color

    if [ "$color" = "red" ]; then
        break
    fi

    echo 'Nope, try again'
done

echo "That's correct!"

Обратите внимание, что теперь цикл стал бесконечным и завершается только оператором break? Это останавливает пользователя от выхода из цикла с помощью Ctrl+D и требует, чтобы он вместо этого ввел правильный ввод. При вводе неверного ввода у пользователя дополнительно снова запрашивается цвет.

Это гарантирует, что после цикла $colorбудет red.

2
28.04.2021, 23:14

Вы должны использовать свою логику внутри цикла while-

while true; do
  echo -n "What is my favorite color?  "
  read favorite
  if [[ $favorite == "red" ]]; then
     echo "That's Right"
     exit 0
  fi
  echo "No, try again."
done
1
28.04.2021, 23:14

Теги

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