Скрипт bash .sh вместо завершения / выхода

347
Ev-

Я пишу свой самый первый скрипт bash. Каждый раз, когда я запускаю его, чтобы убедиться, что он работает, все работает именно так, как я хотел бы, за исключением doneкоманды в самом конце. Вместо этого он зацикливается на вопросе, спрашивающем пользователя, уверены ли они, что хотят авторизовать его для внесения изменений, которые он сделает.

Поскольку я пишу сценарий впервые, я уверен, что есть более эффективные и эффективные способы выполнения действия, которое я написал, поэтому я не запрашиваю информацию по этому вопросу. Тот факт, что он делает то, что я хотел бы сделать (даже если это не может закончиться), для меня достаточно хорош в данный момент.

Вот сценарий (все, что вы видите, [with backets]я включил только для этого SU: Вопрос, а не в самом сценарии):

#!/bin/bash  perl -e 'print "\n"x128;'  echo ' ' ; echo ' ' ;   echo "   [Omitted to make this SU:Question shorter]  ⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓  TLDR the above info? That's okay, it is also available in the included README.  ⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓ "  [This does not do anything, just something neat I learned how to do...]  c=3 # seconds to wait REWRITE="\e[25D\e[1A\e[K" echo " First thing first... I'll need you have run this as ROOT/SU..." while [ $c -gt 0 ]; do  c=$((c-1)) sleep 1 #echo -e " $$c" done  echo ' '    if [ $(id -u) != 0 ]; then echo " Oops, you didn't run this as ROOT or SU! Here is the proper command:  ⟹ sudo ./enable-wifi.sh ⟸  " exit # elevate script privileges  else echo " ⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓  Awesome, you're ready!"   fi  while true; do read -p " Just to make sure... Do you wish to execute this script?  Please enter [Y/y] / [N/n] here: " yn  case $yn in [Yy]* ) sudo modprobe -r acer-wmi ; sudo rfkill unblock all ; echo "blacklist acer_wmi" | sudo tee /etc/modprobe.d/acer-wmi.conf ; clear ; echo ' ' ; echo ' ' ; echo 'DONE!' ; echo ' ' ; echo ' ' ; echo 'The WIFI Card should be working now!' ; echo ' ' ; echo ' ';; [Nn]* ) echo ' ' ; echo ' ⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓  You have decided to cancel, this script will end immediately  without making any changes to your HP Envy x360.!  ' ; exit;; # * ) echo "Please answer yes or no.";; esac   done 

Большое спасибо за то, что взглянули на этот вопрос и помогли мне!

~ Эв

0
Ну, что ты ожидал от этого? `пока правда; до` означает «делай это навсегда»; цикл не может быть завершен, кроме как путем `выхода`, который происходит, если пользователь вводит« Нет ». Scott 6 лет назад 2

1 ответ на вопрос

1
simlev

за исключением doneкоманды

done это не команда.

Кажется, есть недоразумение: ключевое слово doneне означает, что скрипт выполнен, и может завершить выполнение. Это вместо аналога предыдущего doключевого слова в while...do. Это означает: когда whileусловие ложно, выполнить следующую инструкцию после doneключевого слова.

Может быть, вы хотите добавить exitв конце списка команд, которые выполняются, если пользователь выбирает Y.

Обновить:

Я упоминал exitпросто потому, что он уже использовался в [Nn]ветке, но это только исправило бы скрипт. Использование breakвместо того, exitчто было предложено Гордоном Дэвиссоном, вместо этого - лучшая идея, которая представляет улучшение, позволяющее дальнейшую разработку сценария.

Использование `break` (вместо` exit`) также сработало бы - это заставило бы его продолжаться после окончания цикла (ключевое слово `done`), поэтому, если бы в скрипте оставалось больше, который будет выполнен , Gordon Davisson 6 лет назад 1

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