ubuntuusers.de

Bash Skript | "while" Endlos-Schleife

Status: Gelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

dikay96

Anmeldungsdatum:
18. Januar 2021

Beiträge: Zähle...

Hallo zusammen!

Ich habe mir ein Bash Skript erstellt, mithilfe dessen ich die Post-installation automatisieren möchte (aufgerufen über sudo wget -O - https://raw.githubusercontent.com/dankoller112/Shell-Ubuntu-Install/main/deb-post-install.sh | bash) . Dabei habe ich eine While Schleife erstellt, in der zur Installation von "snap" aufgefordert wird. Sofern gewünscht (falls nicht auf System vorhanden) soll dies zunächst installiert werden, wenn nicht, soll die while Schleife verlassen & mit dem Skript fortgefahren werden.

Leider landet mein Skript in einer Endlosschleife in der "Please answer yes or no." ausgegeben wird & ich finde leider nicht den Fehler...

1
2
3
4
5
6
7
8
while true; do
    read -p "Do you want to install snap?" yn
    case $yn in
        [Yy]* ) sudo apt install snap -y && apt install snapd -y; break;;
        [Nn]* ) break;;
        * ) echo "Please answer yes or no.";;
    esac
done

Ich hoffe ihr könnt mir weiterhelfen. Vielleicht hat jemand eine Idee?

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3781

Probier mal

while true; do
    read -p "Do you want to install snap?" yn
    case $yn* in
...

dikay96

(Themenstarter)

Anmeldungsdatum:
18. Januar 2021

Beiträge: Zähle...

Vielen Dank, brachte aber leider keinen Erfolg...

Edit: Ich habe das Skript heruntergeladen & lokal ausgeführt → funktioniert. Wenn ich es via wget von Github aufrufe & ausführen will, gerate ich in die Endlosschleife.

sebix Team-Icon

Moderator, Webteam

Anmeldungsdatum:
14. April 2009

Beiträge: 5576

Wie fuehrst du das Skript jeweils aus? Nachdem das Skript keine Shebang hat, ist moeglicherweise der Interpreter (die Shell) unterschiedlich (sh vs bash).

dikay96

(Themenstarter)

Anmeldungsdatum:
18. Januar 2021

Beiträge: 7

Lokal auf meinem Gerät führe ich das Skript wie folgt aus: sudo sh ./deb-post-install.sh (jedoch funktioniert es auch mit sudo bash ./deb-post-install.sh)

Wenn ich allerdings wie angedacht via

1
wget -O - https://raw.githubusercontent.com/dankoller112/Shell-Ubuntu-Install/main/deb-post-install.sh | bash

aufrufe, gerate ich in besagte Endlosschleife.

Möglicherweise ein Anfängerfehler den ich übersehe, nur leider weiß ich nicht wo...

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9615

Wohnort: Münster

dikay96 schrieb:

[…] Wenn ich allerdings wie angedacht via

wget -O - https://raw.githubusercontent.com/dankoller112/Shell-Ubuntu-Install/main/deb-post-install.sh | bash

aufrufe, gerate ich in besagte Endlosschleife.

Wenn Du der Shell das Skript per stdin übergibt, liest sie es, führt den Befehl aus und wartet dann auf weitere Eingaben von ihrem stdin, d.h. dem wget-Befehl. Von dort kommt aber nichts mehr bzw. read liest immer nur EOF. EOF ist weder "y" noch "n".

Wenn Du über stdin dem Shell-Skribt etwas geben willst, darfst Du keine Pipe verwenden. Ändere den Aufruf, z.B.:

bash -c $( wget -O - https://raw.githubusercontent.com/dankoller112/Shell-Ubuntu-Install/main/deb-post-install.sh ) 

Wenn das dann nicht funktioniert, bist Du in der Quoting-Hölle gelandet.

Eine weniger elegante, dafür aber besser funktionierende Variante ist, das Ergebnis von wget einfach als Datei zu speichern und diese dann auszuführen.

Es ist übrigens eine gute Idee, in formalen Entlosschleifen immer auf EOF zu testen.

dikay96

(Themenstarter)

Anmeldungsdatum:
18. Januar 2021

Beiträge: 7

Eine weniger elegante, dafür aber besser funktionierende Variante ist, das Ergebnis von wget einfach als Datei zu speichern und diese dann auszuführen.

Das habe ich dann letzten Endes auch getan & siehe da, es funktioniert!

Ich rufe das Skript nun via

1
sudo wget -O - https://raw.githubusercontent.com/dankoller112/Shell-Ubuntu-Install/main/deb-post-install.sh -v -O deb-post-install.sh && sudo sh ./deb-post-install.sh; rm -rf deb-post-install.sh

auf & das erfüllt seinen Zweck.

Vielen Dank für die freundliche & kompetente Unterstützung ☺

Antworten |