bash: Parameter in einer Funktion verwenden

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:

bash: Parameter in einer Funktion verwenden

Beitrag von Yadgar » 15.07.2018 14:34:45

Hi(gh)!

Folgendes Problem: dieses Skript (nur ein Ausschnitt, in Wirklichkeit ist das Teil länger), das mein Konsolen-Grafikprogramm "yip" steuern soll, schmeißt eine Fehlermeldung in Zeile 37:

/home/yadgar/scripts/yipc64blocks.sh: Zeile 37: [: 1: Einstelliger (unärer) Operator erwartet.

Code: Alles auswählen

# bwfsyip.sh
# Directs use of "yip"`

if [ $1 = "old" ]
then
  echo "Erster Frame der Sequenz:"
  read fframe
  echo "Letzter Frame der Sequenz:"
  read laframe
  echo "Maximale Stellenzahl:"
  read maxdigits
  echo "Füllfarbe: "
  read fillcolor
  echo "Art der Rasterung:"
  read dither
  sourcedir="/home/Video/maxcanadalynx"
  oldfile="maxcanadalynx20120211a-"
  newfile="maxcanadalynx20120211a_c64_blocks_nodither-"
else
  sourcedir=$1
  oldfile=$2
  fframe=$3
  lafram=$4
  maxdigits=$5
  fillcolor=$6
  dither=$7
  threshold=$8
  mode=$9
  newfile=${10}
fi

#function digits()
digits()
{
  c=1
  d=0
  while [ $c -le $1 ]
  do
    c=$((c*10))
    d=$((d+1))
  done
  return $d
}
Die Fehlermeldung bezieht sich auf die Funktion "digits()", die die Stellenzahl von Dezimalzahlen ermitteln soll. Das Gesamtprogramm bekommt allerdings ebenfalls Parameter übergeben, in diesem Fall den String "old", und nach allem, was ich bislang über Funktionen in bash zu wissen glaubte, können $1, $2 usw. auch in Funktionen verwendet werden, ohne das es zu Namenskollisionen kommt... oder etwa doch nicht? Wie werde ich den Fehler los?
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: bash: Parameter in einer Funktion verwenden

Beitrag von tobo » 15.07.2018 15:14:16

Kennst du das noch?
viewtopic.php?f=34&t=167393&p=1151835&h ... n#p1151835

Da Rückfragen offensichtlich sinnlos sind: Wenn du der Funktion digits beim Aufruf keinen Parameter übergibst, dann gibt's darin auch kein $1.

Benutzeravatar
Yadgar
Beiträge: 954
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Re: bash: Parameter in einer Funktion verwenden

Beitrag von Yadgar » 15.07.2018 15:29:55

Hi(gh)!
tobo hat geschrieben: ↑ zum Beitrag ↑
15.07.2018 15:14:16
Kennst du das noch?
viewtopic.php?f=34&t=167393&p=1151835&h ... n#p1151835

Da Rückfragen offensichtlich sinnlos sind: Wenn du der Funktion digits beim Aufruf keinen Parameter übergibst, dann gibt's darin auch kein $1.
Ich habe zwischenzeitlich auch herausgefunden, wie es einfacher geht:

Code: Alles auswählen

vornullen=4;
mitvornullen=$(printf '%0'$vornullen'd' 34);
echo $mitvornullen;
Trotzdem danke für den Hinweis!
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...

Benutzeravatar
Meillo
Moderator
Beiträge: 8781
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash: Parameter in einer Funktion verwenden

Beitrag von Meillo » 15.07.2018 15:59:32

Vorschlag fuer besseres Quoting:

Code: Alles auswählen

mitvornullen=$(printf "%0${vornullen}d" 34);
Use ed once in a while!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: bash: Parameter in einer Funktion verwenden

Beitrag von rendegast » 15.07.2018 16:14:20

Ist sichergestellt, daß die Funktion im Skript auch mit einem Parameter aufgerufen wird?

Die $1 im Test der Funktion bezieht sich darauf, nicht auf den $1, der dem Skript übergeben wird.
Wenn ich hier die Funktion parameterlos aufrufe, erhalte ich genau den Fehler,
da der eine benötigte Parameter im Test halt leer ist.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Antworten