Я пишу свой самый первый скрипт 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 "  ${REWRITE}$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

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

~ Эв

1 ответ1

1

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

done не команда.

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

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

Обновить:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .