Namenskonflikt bei bash-Skriptaufruf mit Parametern

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Yadgar
Beiträge: 954
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Namenskonflikt bei bash-Skriptaufruf mit Parametern

Beitrag von Yadgar » 05.11.2017 17:15:25

Hi(gh)!

Folgendes Problem: ein Skript batchconv.sh, das mittels ImageMagick eine große Anzahl von Einzel-Frames von PNG nach TGA konvertieren soll, bekommt aus einem übergeordneten Skript folgende Parameterliste übergeben:

Code: Alles auswählen

batchconv.sh $workdir $orgfile"_avg"$avgframes"-" png 1 $filenum2 3 tga # Umwandlung nach TGA
$1: Quellverzeichnis (in diesem Fall auch Zielverzeichnis)
$2: Name der zu konvertierenden Datei (ohne fortlaufende Frame-Nummer und Endung)
$3: Quellformat
$4: Framenummer der ersten Datei
$5: Framenummer der letzten Datei
$6: Höchste in der Liste der zu konvertierenden Datei vorkommende Anzahl von Dezimalstellen
$7: Zielformat

Soweit, so gut... allerdings sind in batchconv.sh auch zwei Funktionen definiert, die ihrerseits jeweils einen Parameter übergeben bekommen:

Code: Alles auswählen

#function digits(), ermittelt Anzahl der Stellen einer Zahl
digits()
{
  c=1
  d=0
  while [ $c -le $1 ]
  do
    c=$((c*10))
    d=$((d+1))
  done
  return $d
}
und

Code: Alles auswählen

#function leadingzeroes(), erzeugt führende Nullen
leadingzeroes()
{
  lz=""
  for i in $(seq 0 $1)
  do
    lz=${lz}0
  done
  echo $lz
  return $lz
}  
Innerhalb der Funktionen heißt der übergebene Parameter natürlich auch $1 - und meine bash ist aus irgendeinem Grund nicht in der Lage, zwischen den beiden Gültigkeitsbereichen (also außerhalb und innerhalb der Funktionen) zu unterscheiden, so dass ich regelmäßig eine Fehlermeldung bekomme:

/home/yadgar/scripts/batchconv.sh: Zeile 9: [: png: Ganzzahliger Ausdruck erwartet.

Was kann ich da machen?
If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

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

Re: Namenskonflikt bei bash-Skriptaufruf mit Parametern

Beitrag von tobo » 05.11.2017 18:30:41

Zunächst mal ist anzuraten, dass du deine Argumente quotest. Also z:B. sowas:

Code: Alles auswählen

batchconv.sh "$workdir" "${orgfile}_avg${avgframes}-" png 1 "$filenum2" 3 tga # Umwandlung nach TGA
und sowas:

Code: Alles auswählen

while [ "$c" -le "$1" ]
Yadgar hat geschrieben:Innerhalb der Funktionen heißt der übergebene Parameter natürlich auch $1 - und meine bash ist aus irgendeinem Grund nicht in der Lage, zwischen den beiden Gültigkeitsbereichen (also außerhalb und innerhalb der Funktionen) zu unterscheiden, so dass ich regelmäßig eine Fehlermeldung bekomme:
Die Bash unterscheidet das sehrwohl und vergibt einer Funktion eine neue "lokale" Positionsparameterliste. Somit kann das nicht sein. Wenn du also alles gequotet hast und der Fehler noch immer auftritt, dann zeig mal diese Zeile 9 des Scripts (die while-Zeile?) und den Aufruf der umgebenden Funktion von Zeile 9.

owl102

Re: Namenskonflikt bei bash-Skriptaufruf mit Parametern

Beitrag von owl102 » 05.11.2017 18:51:57

Zusätzlich zu den Anmerkungen von tobo möchte ich noch anmerken, daß Zeilen wie

Code: Alles auswählen

return $lz
nicht immer funktionieren, denn als Rückgabewert ist lediglich eine Ganzzahl zwischen 0 und 255 erlaubt. Bei allem anderen muß man entweder eine globale Variable setzen und später verwenden (sich also einfach das "return $lz" sparen und stattdessen $lz weiter verwenden, oder den Rückgabewert mit echo ausgeben, z.B.:

Code: Alles auswählen

leadingzeroes()
{
  ..
  echo "$lz"
}
x=$(leadingzeroes 3)
echo "x ist \"$x\""
Zuletzt geändert von owl102 am 06.11.2017 10:18:21, insgesamt 2-mal geändert.

Benutzeravatar
MegaV0lt
Beiträge: 163
Registriert: 21.11.2011 11:16:07
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Namenskonflikt bei bash-Skriptaufruf mit Parametern

Beitrag von MegaV0lt » 06.11.2017 07:59:19

Mit Bash kann man führende Nullen und Die Zeichenlänge ganz einfach ohne externe Programme bestimmen

Code: Alles auswählen

[[ ${#VAR} -lt 2 ]] && VAR="0${VAR}"  # VAR mit führender 0 wenn kürzer als 2
LEN="${#VAR}  # Länge des  Wertes der Variable VAR"
Bei drei oder mehr stellen das ganze in wine While-Schleife packen
"Das Internet? Gibt's diesen Blödsinn immer noch?"
[Homer Simpson], Sicherheitsinspektor im Kernkraftwerk Springfield.

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: Namenskonflikt bei bash-Skriptaufruf mit Parametern

Beitrag von Phineas » 06.11.2017 15:51:27

Zahlen mit führenden Nullen lassen sich übrigens ganz ohne Rechnerei und Aufwand mit printf erzeugen.
Ein Beispiel für die Bash:

Code: Alles auswählen

printf %03d\\n {1,10,100}

Antworten