ubuntuusers.de

script 'bereitschaft', Verbesserungen?

Status: Gelöst | Ubuntu-Version: Xubuntu 24.04 (Noble Numbat)
Antworten |

Baddabumm

Avatar von Baddabumm

Anmeldungsdatum:
23. Oktober 2009

Beiträge: 292

Wohnort: Schwaben

Hallo,

Vorweg: Der systemeigene "Bereitschaftsmodus" funktioniert hier nicht! Mein bash-script funktioniert soweit gut, aber mich beschleicht ein Gefühl von Umständlichkeit ☺

Mein Script soll folgende Bedingungen erfüllen:

  1. Nur Zahlen (numerisch)

  2. Kein "-|,|.|"

  3. Keine gemischter input gleichzeitig

  4. Keine Sonderzeichen

Hier mein script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash

# Bereitschaftsmodus: suspend to RAM
# Empfehlung Eintrag in visudo:
# user ALL = NOPASSWD:[pfad]/bereitschaft
# Aufruf: sudo [pfad]/bereitschaft [Sekunden]
# Erstellt von Baddabumm, März 2025
# Version 1.02 getestet mit Xubuntu 24.04.2


# Suspend to RAM - Anweisung
MEM="echo mem | sudo tee /sys/power/state"

# Test auf Vorhandensein von dialog
DLG=`type -p dialog`
if [ ! -f "$DLG" ]; then
  echo -e "\n$0: Programm 'dialog' wurde nicht gefunden!\n"
  read -p "Trotzdem in Bereitschaft gehen? [Eingabe]. Abbruch mit [Strg+C].."
  eval $MEM && exit 0
fi 

# Prüft, ob ohne oder mit Startparameter
if [ -z  "$1" ];
  then SEC=30
else
  SEC=$1
fi

# Prüft auf gemischten input oder Zahl negativ
if echo "$1" | grep -e '[[:alpha:]]' || (( "$1" < 0 )); then
  read -t 3 -p "Standardwert 30s wird gesetzt! '$1' Sekunden ungültig: "
  SEC=30
fi

# Hauptdialog für Bereitschaftsmodus
dialog --title " Bereitschaftsmodus " \
       --backtitle "Aufruf: $0 [n] Sekunden aktuell: $SEC s (Standard: 30s)" \
       --pause "\nIn den Bereitschaftsmodus gehen?" 10 36 $SEC

# dialog-Rückgabewert von $?
# 0   = [OK] button.
# 1   = [Abbrechen] button.
# 255 = [Esc] + DIALOG_ERROR

case $? in
    0) eval $MEM;;
    1) exit 0;;
  255) clear ; read -t 3 -p "Parameter '$1' ungültig: Komma/Punkt/Sonderzeichen nicht erlaubt! Abbruch! ";;
esac

Wie kann ich alle Bedingungen in der Zeile:

1
if echo "$1" | grep -e '[[:alpha:]]' || (( "$1" < 0 )); ..

erfüllen und somit die vorletzte Zeile (case $? 255).. als überflüssig streichen? Danke!

Bearbeitet von rklm:

Aufzählung und Codeblock. Bitte beachte Forum/Syntax und nutze die Vorschaufunktion!

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 241

Wohnort: Aachen

Moin,

Baddabumm schrieb:

Wie kann ich alle Bedingungen in der Zeile: if echo "$1" | grep -e 'alpha]' || [1]; .. erfüllen

1
2
3
if grep -qvE '^[0-9]+$' <<<$1;then
  #...
fi

Gruß Thomas

Baddabumm

(Themenstarter)
Avatar von Baddabumm

Anmeldungsdatum:
23. Oktober 2009

Beiträge: 292

Wohnort: Schwaben

Vielen Dank, Super!

Fast perfekt! Nur bei keinem Startparameter $1 kommt immer noch folg. Zeile:

read -t 3 -p "Standardwert 30s wird gesetzt! '$1' Sekunden ungültig: "

Vielleicht läßt sich ja auch noch das Leerzeichen in die regex integrieren?

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 241

Wohnort: Aachen

Baddabumm schrieb:

Fast perfekt! Nur bei keinem Startparameter $1 kommt immer noch folg. Zeile:

Das heisst wenn der Parameter leer ist, ist das auch in Ordnung? Dann einfach das "+" durch ein "*" ersetzen und das $1 in Anführungszeichen setzen.

1
2
3
if grep -qvE '^[0-9]*$' <<<"$1";then
  #...
fi

Das Plus steht für die Mengenangabe "1 oder mehr", d.h. es muss mindestens eine Zahl vorhanden sein. Das Sternchen steht hingegen für die Mengenangabe "0 oder mehr".

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9564

Wohnort: Münster

Baddabumm schrieb:

[…] Der systemeigene "Bereitschaftsmodus" funktioniert hier nicht

Was verstehst Du darunter? Man kann zwar dem Kernel auf sehr verschiedene Methoden mitteilen, dass er in den Bereitschaftsmodus wechseln soll, aber es gibt nur einen Kernel.

Das dafür übliche Verfahren ist:

systemctl suspend 

und dieser Standardbefehl ersetzt Dein komplettes Skript. Was passiert denn, wenn Du das versuchst?

Und wie die Varianten des Bereitschaftsmodus zu parametrieren sind, steht im Wiki: Bereitschaft

Baddabumm

(Themenstarter)
Avatar von Baddabumm

Anmeldungsdatum:
23. Oktober 2009

Beiträge: 292

Wohnort: Schwaben

TK87 schrieb:

Baddabumm schrieb:

Fast perfekt! Nur bei keinem Startparameter $1 kommt immer noch folg. Zeile:

Das heisst wenn der Parameter leer ist, ist das auch in Ordnung? Dann einfach das "+" durch ein "*" ersetzen und das $1 in Anführungszeichen setzen.

1
2
3
4
> if grep -qvE '^[0-9]*$' <<<"$1";then
>   #...
> fi
> 

Das Plus steht für die Mengenangabe "1 oder mehr", d.h. es muss mindestens eine Zahl vorhanden sein. Das Sternchen steht hingegen für die Mengenangabe "0 oder mehr".

Danke, Meine Lösung ist jetzt:
if grep -qvE '^[0-9]+$' <<<$SEC; then

Baddabumm

(Themenstarter)
Avatar von Baddabumm

Anmeldungsdatum:
23. Oktober 2009

Beiträge: 292

Wohnort: Schwaben

@kb:

systemctl suspend

Damit steht mein System mit schwarzem screen still! hard reset war fällig

AMD Phenom 945 (lt. Bios gibts sogar schon S3 state)

grep /sys/power/{state,mem_sleep} {{{ /sys/power/state:freeze mem disk /sys/power/mem_sleep:s2idle [deep] }}}

Antworten |