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 16:43:46] – [Zählschleifen] manfredbash [2025-08-31 22:08:18] (aktuell) – [Zahlen von eine Basis in eine andere Basis umrechnen] manfred
Zeile 338: 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 726: 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 734: 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 760: 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,
 was ja eigentlich geht, was ja eigentlich geht,
 dann versagt diese Methode... :-( dann versagt diese Methode... :-(
 +
 +
 +==== 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>
  
  
Zeile 1033: 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.1714236226.txt · Zuletzt geändert: von manfred