Shell- / Bash-Skript mit Entscheidung [Gelöst]

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Shell- / Bash-Skript mit Entscheidung [Gelöst]

Beitrag von jmar83 » 30.11.2020 15:29:21

Hallo zusammen

1. Ich muss zwangsläufig was eingeben (Taste für Entscheidung) das im `options`-Array ist. Deshalb ist dort `1.) ... ` sowie `2.) ... ` enthalten - damit ich anschliessend `1` oder `2` dabei eingeben kann.

2. Zusätzlich dazu macht das ganze aber noch mal selbst `1)` sowie `2)`, was dann letztendlich so aussieht:

Code: Alles auswählen

1) 1.) ...
2) 2.) ...

Funktioniert zwar, ist aber extrem hässlich.

Als Java-, PHP & .NET-Entwickler weist für mich (zumindest auf die Schnelle) nix drauf hin, wass irgendwo der Schleifencounter ausgegeben wird. Es stehen nur echo's vor den Sätzen:

Code: Alles auswählen

#!/bin/bash
clear && set -e;
PS3='Bitte APT-Repository für die Installation wählen: ';
options=("1.) Verwende ABC.li als APT-Repo = Development / Test" "2.) Verwende ABC.net als APT-Repository = Produktiv / Release");
USE_PROD=$(cat /dev/null);
select opt in "${options[@]}";
do
  case $opt in
    *"1"*)
      echo "Verwende ABC.li als APT-Repository = Development / Test";
      USE_PROD="0";
      break;
        ;;
    *"2"*)
      echo "Verwende ABC.net als APT-Repository = Produktiv / Release";
      USE_PROD="1";
      break;
        ;;
    *)
      echo "Ungültige Wahl: $REPLY";
      exit -1;
        ;;
    esac;
done;
set -x;
echo "USE_PROD: "$USE_PROD;

Vielen Dank für die Feedbacks.
Zuletzt geändert von jmar83 am 11.05.2021 18:30:33, insgesamt 1-mal geändert.
Freundliche Grüsse, Jan

worker777
Beiträge: 103
Registriert: 14.04.2015 07:59:26

Re: Shell- / Bash-Skript mit Entscheidung

Beitrag von worker777 » 30.11.2020 15:47:02

Für

Code: Alles auswählen

USE_PROD=$(cat /dev/null);
nimmst wohl einfach ein

Code: Alles auswählen

unset USE_PROD
und bei

Code: Alles auswählen

echo "USE_PROD: "$USE_PROD;
kannst mit

Code: Alles auswählen

echo "USE_PROD: ${USE_PROD:4:-1}"
Die Ausgabe vorne "abschneiden".

.... falls es das ist, was Du gefragt/gesucht hast. Ansonsten ist es recht schwer zu verstehen worauf Du hinaus möchtest...

tobo
Beiträge: 1993
Registriert: 10.12.2008 10:51:41

Re: Shell- / Bash-Skript mit Entscheidung

Beitrag von tobo » 30.11.2020 16:04:38

worker777 hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 15:47:02
Für

Code: Alles auswählen

USE_PROD=$(cat /dev/null);
nimmst wohl einfach ein

Code: Alles auswählen

unset USE_PROD
Ist aber nicht dasselbe:
man unset hat geschrieben: Note that:

VARIABLE=

is not equivalent to an unset of VARIABLE; in the example, VARIABLE is set to "". Also, the variables that can be unset should not be misinterpreted to include the special parameters (see Section 2.5.2, Special Parameters).
Hat Relevanz bei z.B. ${PARAMETER:-WORD} vs. ${PARAMETER-WORD} (erweitert mit/ohne ":"). Siehe man bash (Abschnitt: Parameter Expansion).

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Shell- / Bash-Skript mit Entscheidung

Beitrag von JTH » 30.11.2020 16:12:06

jmar83 hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 15:29:21
Deshalb ist dort `1.) ... ` sowie `2.) ... ` enthalten - damit ich anschliessend `1` oder `2` dabei eingeben kann.
Das ist nicht notwendig, wie du bemerkt hast:
jmar83 hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 15:29:21
2. Zusätzlich dazu macht das ganze aber noch mal selbst `1)` sowie `2)`, was dann letztendlich so aussieht:

Code: Alles auswählen

1) 1.) ...
2) 2.) ...

select selbst nummeriert die übergebenen Auswahlmöglichkeiten:
help select hat geschrieben: select: select NAME [in WORDS ... ;] do COMMANDS; done
Select words from a list and execute commands.

[…] The set of expanded words is printed on the standard error, each preceded by a number.
Siehe https://www.gnu.org/software/bash/manua ... dex-select. Also einfach das 1.), 2.) in deinen Möglichkeiten weglassen.
Manchmal bekannt als Just (another) Terminal Hacker.

worker777
Beiträge: 103
Registriert: 14.04.2015 07:59:26

Re: Shell- / Bash-Skript mit Entscheidung

Beitrag von worker777 » 30.11.2020 16:13:47

tobo hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 16:04:38
worker777 hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 15:47:02
Für

Code: Alles auswählen

USE_PROD=$(cat /dev/null);
nimmst wohl einfach ein

Code: Alles auswählen

unset USE_PROD
Ist aber nicht dasselbe:
man unset hat geschrieben: Note that:

VARIABLE=

is not equivalent to an unset of VARIABLE; in the example, VARIABLE is set to "". Also, the variables that can be unset should not be misinterpreted to include the special parameters (see Section 2.5.2, Special Parameters).
Hat Relevanz bei z.B. ${PARAMETER:-WORD} vs. ${PARAMETER-WORD} (erweitert mit/ohne ":"). Siehe man bash (Abschnitt: Parameter Expansion).
Achso, okay. Danke für den Hinweis.
Naja, bin kein "Programmator", dachte nur das ein 'unset' kürzer als ein '$(cat /dev/null)' ist ^^ ...

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Shell- / Bash-Skript mit Entscheidung

Beitrag von JTH » 30.11.2020 16:23:48

JTH hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 16:12:06
Also einfach das 1.), 2.) in deinen Möglichkeiten weglassen.
Nachtrag: Du musst dann allerdings die von select auch gesetzte Variable REPLY anschauen, opt enthält deinen kompletten ausgewählten String. REPLY enthält hier nur die 1, 2 o.ä.:

Code: Alles auswählen

select "$REPLY" in "${options[@]}";
do
    …
done;
Manchmal bekannt als Just (another) Terminal Hacker.

tobo
Beiträge: 1993
Registriert: 10.12.2008 10:51:41

Re: Shell- / Bash-Skript mit Entscheidung

Beitrag von tobo » 30.11.2020 16:43:43

worker777 hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 16:13:47
Naja, bin kein "Programmator", dachte nur das ein 'unset' kürzer als ein '$(cat /dev/null)' ist ^^ ...
Ja, das ist ja auch außergewöhnlich umständlich geschrieben!?
Wenn die Variable leer sein soll, dann macht man var= und wenn sie überhaupt nicht existieren soll, dann eben ein unset var. Wenn man das aber später überhaupt nicht abprüft, dann ist es schnurz egal...

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell- / Bash-Skript mit Entscheidung

Beitrag von jmar83 » 30.11.2020 16:57:02

Der Initialwert der Variable ist im Prinzip egal - kann alles ausser "0" oder "1" sein.


"Das ist nicht notwendig, wie du bemerkt hast:"

Doch, sonst gibt es zwar `1)` sowie `2)` aus, reagiert aber nicht auf 1 + 2 als Tastatureingabe


"Nachtrag: Du musst dann allerdings die von select auch gesetzte Variable REPLY anschauen, opt enthält deinen kompletten ausgewählten String. REPLY enthält hier nur die 1, 2 o.ä.:"

Danke werde mal schauen, wenn das Skript fertig ist werde ich noch ein wenig "Kosmetik" durchführen!! :THX:
Freundliche Grüsse, Jan

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Shell- / Bash-Skript mit Entscheidung

Beitrag von JTH » 30.11.2020 18:20:13

jmar83 hat geschrieben: ↑ zum Beitrag ↑
30.11.2020 16:57:02
Doch, sonst gibt es zwar `1)` sowie `2)` aus, reagiert aber nicht auf 1 + 2 als Tastatureingabe
Hmm, wie meinst du das? Es reagiert dann auf die 1 oder 2, jeweils gefolgt von Enter.

Meinst du, dass die wortwörtliche Eingabe von „1 + 2“ nicht funktioniert wie gehofft? Das hätte nichts mit den vorgegebenen Möglichkeiten beim Aufruf von select zu tun. So eine Mehrfachauswahl müsstest du in deinem Case abfangen.

Als vereinfachtes Beispiel mit dem REPLY:

Code: Alles auswählen

$ cat sh
#!/bin/bash

opts=(foo bar baz)

select opt in "${opts[@]}"; do
	echo "REPLY=$REPLY"
	echo "opt=$opt"
done
$ ./sh 
1) foo
2) bar
3) baz
#? 1 <ENTER>
REPLY=1
opt=foo
#? 2 <ENTER>
REPLY=2
opt=bar
#? 3 <ENTER>
REPLY=3
opt=baz
Manchmal bekannt als Just (another) Terminal Hacker.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Shell- / Bash-Skript mit Entscheidung

Beitrag von jmar83 » 30.11.2020 18:21:51

Besser gesagt: 1 ODER 2 ;-)

Vielen Dank, bin nun zuhause angekommen und werde es so sobald als möglich anschauen. :THX:
Freundliche Grüsse, Jan

Antworten