Benutzer-Werkzeuge

Webseiten-Werkzeuge


bash

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
bash [2024-04-27 15:51:26] – [Zählschleifen] manfredbash [2025-08-31 22:08:18] (aktuell) – [Zahlen von eine Basis in eine andere Basis umrechnen] manfred
Zeile 238: Zeile 238:
  
 ===== Zählschleifen ===== ===== Zählschleifen =====
- 
-[[https://de.linux-console.net/?p=19969]] 
  
  
Zeile 340: Zeile 338:
   > echo "l(8)/l(2)" | bc -l   > echo "l(8)/l(2)" | bc -l
   3.00000000000000000002   3.00000000000000000002
 +
 +  > echo "a=1; b=2; c=3; print \"a=\", a, \" b=\", b, \" c=\", c; print \"\nSumme:\", a + b + c;print \"\n\""
 +  a=1; b=2; c=3; print "a=", a, " b=", b, " c=", c; print "\nSumme:", a + b + c;print "\n"
 +  
 +  > echo "a=1; b=2; c=3; print \"a=\", a, \" b=\", b, \" c=\", c; print \"\nSumme:\", a + b + c;print \"\n\"" | bc -lq
 +  a=1 b=2 c=3
 +  Summe:6
 +
 +
 +=== Zahlen von eine Basis in eine andere Basis umrechnen ===
 +
 +  ibase = In welcher Basis verstehe ich deine Eingaben?
 +  obase = In welcher Basis soll ich die Ergebnisse ausgeben?
 +
 +  > echo "ibase=10; obase=2; 255" | bc
 +  11111111
 +
 +  > echo "255" | sed "s/.*/ibase=10; obase=2; &/" | bc
 +  11111111
 +
 +  > vim calc.bc
 +  ibase=10;
 +  obase=2;
 +  
 +  > echo "255" | bc calc.bc
 +  11111111
 +
 +<code c Zahlenbasis.bc>
 +obase = read();
 +n = read();
 +print n;
 +print "\n"
 +</code>
 +
 +<code bash>
 +> for BASIS in 2 3 5 7 8 12 16; do echo "${BASIS} 123" | tr ' ' '\n' | bc -q ./Zahlenbasis.bc; done
 +1111011
 +11120
 +443
 +234
 +173
 +A3
 +7B
 +</code>
  
  
Zeile 728: Zeile 770:
  
 ===== while ohne sub-shell ===== ===== while ohne sub-shell =====
 +
 +[[https://de.linux-console.net/?p=19969]]
  
 Auf die Variablen, die in einer gewöhnlichen ''while''-Schleife gesetzt werden, Auf die Variablen, die in einer gewöhnlichen ''while''-Schleife gesetzt werden,
Zeile 736: Zeile 780:
  
 Deshalb ist die Ausgabe dieses Skripts auch leer: Deshalb ist die Ausgabe dieses Skripts auch leer:
-  #!/usr/bin/env bash +<code bash> 
-   +#!/usr/bin/env bash 
-  VAR="" + 
-  echo "Test" | while read ZEILE +VAR="" 
-  do +echo "Test" | while read ZEILE 
-          VAR="${ZEILE}" +do 
-  done +        VAR="${ZEILE}" 
-   +done 
-  echo "VAR='${VAR}'"+ 
 +echo "VAR='${VAR}'" 
 +</code>
  
 Dieses Skript liefert dagegen eine Ausgabe: Dieses Skript liefert dagegen eine Ausgabe:
-  #!/usr/bin/env bash +<code bash> 
-   +#!/usr/bin/env bash 
-  VAR="" + 
-  while read ZEILE +VAR="" 
-  do +while read ZEILE 
-          VAR="${ZEILE}" +do 
-  done < <(echo "Test"+        VAR="${ZEILE}" 
-   +done < <(echo "Test"
-  echo "VAR='${VAR}'"+ 
 +echo "VAR='${VAR}'" 
 +</code>
  
 Keine Pipe, Keine Pipe,
Zeile 762: Zeile 810:
  
 Allserdings funktioniert das auch nicht in vollem Umfang: Allserdings funktioniert das auch nicht in vollem Umfang:
-  #!/usr/bin/env bash +<code bash> 
-   +#!/usr/bin/env bash 
-  VAR1="" + 
-  VAR2="" +VAR1="" 
-  VAR3="" +VAR2="" 
-  while read SPALTE1 SPALTE2 SPALTE3 +VAR3="" 
-  do +while read SPALTE1 SPALTE2 SPALTE3 
-          VAR1="${SPALTE1}" +do 
-          VAR2="${SPALTE2}" +        VAR1="${SPALTE1}" 
-          VAR3="${SPALTE3}" +        VAR2="${SPALTE2}" 
-  done < <(echo "Test"+        VAR3="${SPALTE3}" 
-   +done < <(echo "Test"
-  echo " + 
-  VAR1='${VAR1}' +echo " 
-  VAR2='${VAR2}' +VAR1='${VAR1}' 
-  VAR3='${VAR3}' +VAR2='${VAR2}' 
-  "+VAR3='${VAR3}' 
 +" 
 +</code>
  
 Wenn die Zeile gleichzeitig noch in Spalten aufgetrennt werden soll, Wenn die Zeile gleichzeitig noch in Spalten aufgetrennt werden soll,
Zeile 785: Zeile 835:
  
  
-===== leeren Unterverzeichnisse löschen =====+==== Probleme mit der while-Schleife ==== 
 + 
 +führt man in einer WHILE-Schleife komplexe Kommandos aus, dann wird oft nur das erste Kommando ausgeführt oder jedes 2. Kommando nicht ausgeführt: 
 +<code bash> 
 +#!/usr/bin/env bash 
 + 
 +# bei jeder 2. Zeile (Kommando) fehlen an Zeilenanfang, mehrere Zeichen, deshalb bricht es ab 
 + 
 +find . -type f -iname "Air Strike_*.mkv" | sed 's|^[.]/||' | sort | while read FILE 
 +do 
 +        ffmpeg -i "${FILE}" -c:v mpeg4 -b:v 8192k -profile:v 15 -level 5 -g 300 -c:a ac3 -f avi -y "Test_${FILE}".avi 
 +done 
 +</code> 
 + 
 +Als Lösung kann man entweder den Umweg über eine Zwischendatei gehen, die dann als statisches Skript ausgeführt wird: 
 +<code bash> 
 +#!/usr/bin/env bash 
 + 
 +# funktioniert, wie erwartet 
 + 
 +find . -type f -iname "Air Strike_*.mkv" | sed 's|^[.]/||' | sort | while read FILE 
 +do 
 +        Iecho "ffmpeg -i \"${FILE}\" -c:v mpeg4 -b:v 8192k -profile:v 15 -level 5 -g 300 -c:a ac3 -f avi -y \"Test_${FILE}\".avi" 
 +done > /tmp/statisches_Zwischen-Skript.sh 
 +bash /tmp/statisches_Zwischen-Skript.sh 
 +rm -f /tmp/statisches_Zwischen-Skript.sh 
 +</code> 
 + 
 +Oder man wählt die FOR-Schleife, dann muß man aber den ''IFS'' verbiegen, um Dateien mit Leerzeichen verarbeiten zu können: 
 +<code bash> 
 +#!/usr/bin/env bash 
 + 
 +# funktioniert, wie erwartet, aber Dateien mit Leerzeichen kann man so nur mit verbogenem IFS verarbeiten 
 + 
 +IFS=$'\n' 
 +DATEIEN=($(find . -type f -iname "Air Strike_*.mkv" | sed 's|^[.]/||' | sort)) 
 +for FILE in "${DATEIEN[@]}" 
 +do 
 +        ffmpeg -i "${FILE}" -c:v mpeg4 -b:v 8192k -profile:v 15 -level 5 -g 300 -c:a ac3 -f avi -y "Test_${FILE}".avi 
 +done 
 +</code> 
 + 
 + 
 +===== leere Unterverzeichnisse löschen =====
  
 ''rmdir'' löscht nur leere Verzeichnisse, bei vollen wird eine Fehlermeldung ausgegeben: ''rmdir'' löscht nur leere Verzeichnisse, bei vollen wird eine Fehlermeldung ausgegeben:
Zeile 1035: Zeile 1128:
   > echo ${#ARRAY[2]}   > echo ${#ARRAY[2]}
   255   255
 +
 +  > arrayLaenge=${#ARRAY[@]}
 +  > echo "Das Array enthält '${arrayLaenge}' Elemente."
 +  Das Array enthält '3' Elemente.
  
   > testarray=($(find Videos/ -type f))   > testarray=($(find Videos/ -type f))
/home/http/wiki/data/attic/bash.1714233086.txt · Zuletzt geändert: von manfred