Erstellen von Shell-Skripten: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
K (Linkai.zhang verschob die Seite Erstellen von Shellskripten nach Erstellen von Shell-Skripten, ohne dabei eine Weiterleitung anzulegen)
Zeile 1: Zeile 1:
<span id="grundlagen"></span>
+
<span id="grundlagen"></span> # Grundlagen
= Grundlagen =
 
  
 
* [[Umgang mit der Shell]]
 
* [[Umgang mit der Shell]]
 +
*
  
<!----->
 
<span id="logische-operatoren"></span>
 
 
= Logische Operatoren =
 
= Logische Operatoren =
  
Zeile 13: Zeile 11:
 
* den exit code des letzten Befehls kann man mit '''echo $?''' abfragen
 
* den exit code des letzten Befehls kann man mit '''echo $?''' abfragen
  
<!----->
 
<span id="und"></span>
 
 
== UND ==
 
== UND ==
  
Zeile 21: Zeile 17:
 
* ls / &amp;&amp; echo &quot;hat funktioniert&quot;
 
* ls / &amp;&amp; echo &quot;hat funktioniert&quot;
  
<!----->
 
 
  bin  etc        initrd.img.old  lib64      media  proc  sbin  tmp  vmlinuz
 
  bin  etc        initrd.img.old  lib64      media  proc  sbin  tmp  vmlinuz
 
  boot  home        lib            libx32      mnt    root  srv  usr  vmlinuz.old
 
  boot  home        lib            libx32      mnt    root  srv  usr  vmlinuz.old
 
  dev  initrd.img  lib32          lost+found  opt    run  sys  var
 
  dev  initrd.img  lib32          lost+found  opt    run  sys  var
 
  hat funktioniert
 
  hat funktioniert
<span id="oder"></span>
+
 
 
== ODER ==
 
== ODER ==
  
Zeile 33: Zeile 28:
 
* ls nichtexistentedatei || echo &quot;hat nicht funktioniert&quot;
 
* ls nichtexistentedatei || echo &quot;hat nicht funktioniert&quot;
  
<!----->
 
 
  ls: Zugriff auf 'nichtexistentedatei' nicht möglich: Datei oder Verzeichnis nicht gefunden
 
  ls: Zugriff auf 'nichtexistentedatei' nicht möglich: Datei oder Verzeichnis nicht gefunden
 
  hat nicht funktioniert
 
  hat nicht funktioniert
<span id="beispiele"></span>
+
 
 
= Beispiele =
 
= Beispiele =
  
Zeile 44: Zeile 38:
 
* '''pgrep -a sshd'''
 
* '''pgrep -a sshd'''
  
<!----->
 
 
  453 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
 
  453 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
 
* '''ps alx | grep ''<Programm>''''' verbirgt die Kopfzeilen
 
* '''ps alx | grep ''<Programm>''''' verbirgt die Kopfzeilen
  
<!----->
 
 
  4    0    453      1  20  0  10192  6644 -      Ss  ?          0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
 
  4    0    453      1  20  0  10192  6644 -      Ss  ?          0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
 
  0  1000  81102  81042  20  0  6588  2512 pipe_r S+  pts/3      0:00 grep --color sshd
 
  0  1000  81102  81042  20  0  6588  2512 pipe_r S+  pts/3      0:00 grep --color sshd
Zeile 54: Zeile 46:
 
* '''ps alx | head -n 1'''
 
* '''ps alx | head -n 1'''
  
<!----->
 
 
  F  UID    PID    PPID PRI  NI    VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
 
  F  UID    PID    PPID PRI  NI    VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
 
;Gesamter Befehl
 
;Gesamter Befehl
Zeile 60: Zeile 51:
 
* '''ps alx | head -n 1 &amp;&amp; ps alx | grep sshd | grep -v grep'''
 
* '''ps alx | head -n 1 &amp;&amp; ps alx | grep sshd | grep -v grep'''
  
<!----->
 
 
  F  UID    PID    PPID PRI  NI    VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
 
  F  UID    PID    PPID PRI  NI    VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
 
  4    0    453      1  20  0  10192  6644 -      Ss  ?          0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
 
  4    0    453      1  20  0  10192  6644 -      Ss  ?          0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
 
* das letzte '''grep -v grep''' verbirgt den Programm selbst
 
* das letzte '''grep -v grep''' verbirgt den Programm selbst
  
<!----->
 
 
;als Skript
 
;als Skript
  
Zeile 71: Zeile 60:
 
* '''vim pgreppier'''
 
* '''vim pgreppier'''
  
<!----->
 
 
  #!/bin/bash
 
  #!/bin/bash
 
   
 
   
  ps alx | head -n 1 &amp;&amp; ps alx | grep '''$1''' | grep -v grep
+
  ps alx | head -n 1 &amp;&amp; ps alx | grep *'$1*' | grep -v grep
 
* '''chmod +x pgreppier'''
 
* '''chmod +x pgreppier'''
 
* '''pgreppier sshd'''
 
* '''pgreppier sshd'''
  
<!----->
 
 
  F  UID    PID    PPID PRI  NI    VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
 
  F  UID    PID    PPID PRI  NI    VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
 
  4    0    453      1  20  0  10192  6644 -      Ss  ?          0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
 
  4    0    453      1  20  0  10192  6644 -      Ss  ?          0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
Zeile 91: Zeile 78:
 
* '''vim del'''
 
* '''vim del'''
  
<!----->
 
 
  #!/bin/bash
 
  #!/bin/bash
 
   
 
   
Zeile 107: Zeile 93:
 
* '''del test?.dat'''
 
* '''del test?.dat'''
  
<!----->
 
 
  test1.dat in den Papierkorb verschoben.
 
  test1.dat in den Papierkorb verschoben.
 
  test2.dat in den Papierkorb verschoben.
 
  test2.dat in den Papierkorb verschoben.
Zeile 113: Zeile 98:
 
* '''ls ~/.trash'''
 
* '''ls ~/.trash'''
  
<!----->
 
 
  test1.dat  test2.dat  test3.dat
 
  test1.dat  test2.dat  test3.dat

Version vom 2. März 2023, 07:48 Uhr

# Grundlagen

Logische Operatoren

  • Jedes Programm generiert beim Beenden ein exit code (oder return code)
  • Ein Wert von 0 bedeutet, dass das Programm erfolgreich ausgeführt wurde
  • Je nach Fehlerart gibt das Programm einen höheren Wert zurück
  • den exit code des letzten Befehls kann man mit echo $? abfragen

UND

  • Befehl 1 && Befehl 2
  • Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code 0 beendet
  • ls / && echo "hat funktioniert"
bin   etc         initrd.img.old  lib64       media  proc  sbin  tmp  vmlinuz
boot  home        lib             libx32      mnt    root  srv   usr  vmlinuz.old
dev   initrd.img  lib32           lost+found  opt    run   sys   var
hat funktioniert

ODER

  • Befehl 1 || Befehl 2
  • Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code >0 beendet
  • ls nichtexistentedatei || echo "hat nicht funktioniert"
ls: Zugriff auf 'nichtexistentedatei' nicht möglich: Datei oder Verzeichnis nicht gefunden
hat nicht funktioniert

Beispiele

pgreppier

  • pgrep gibt manchmal nicht genug Informationen aus
  • pgrep -a sshd
453 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
  • ps alx | grep <Programm> verbirgt die Kopfzeilen
4     0     453       1  20   0  10192  6644 -      Ss   ?          0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
0  1000   81102   81042  20   0   6588  2512 pipe_r S+   pts/3      0:00 grep --color sshd
  • Ziel ist es ein Skript zu schreiben, das mehr Informationen ausgibt als pgrep
  • ps alx | head -n 1
F   UID     PID    PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
Gesamter Befehl
  • ps alx | head -n 1 && ps alx | grep sshd | grep -v grep
F   UID     PID    PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0     453       1  20   0  10192  6644 -      Ss   ?          0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
  • das letzte grep -v grep verbirgt den Programm selbst
als Skript
  • cd /usr/local/bin
  • vim pgreppier
#!/bin/bash

ps alx | head -n 1 && ps alx | grep *'$1*' | grep -v grep
  • chmod +x pgreppier
  • pgreppier sshd
F   UID     PID    PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0     453       1  20   0  10192  6644 -      Ss   ?          0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups

del

  • rm löscht Dateien, ohne sie dabei in einen Papierkorb zu verschieben
  • Lösung: Wir schreiben ein Skript, das
    • einen Papierkorb erstellt, wenn er nicht bereits existiert
    • beliebig viele angegebene Dateien dorthin verschiebt (so wie bei rm)
    • Auskunft über die Verschiebungen gibt
  • cd /usr/local/bin
  • vim del
#!/bin/bash

papierkorb="$HOME/.trash"

ls $papierkorb > /dev/null 2>&1 || mkdir -p $papierkorb
mv $* $papierkorb

for i in $*
do
    echo $i in den Papierkorb verschoben.
done
  • chmod +x del
  • touch test{1,2,3}.dat
  • del test?.dat
test1.dat in den Papierkorb verschoben.
test2.dat in den Papierkorb verschoben.
test3.dat in den Papierkorb verschoben.
  • ls ~/.trash
test1.dat  test2.dat  test3.dat