Leerer Parameter in Funktion

M

mjnet

Grünschnabel
Guten Tag

Erstmal Hallo zusammen, bin gerade neu hier an Board und freue mich auf tolle Threads.

Stehe an einem dofen Problem:

Ich ziehe Werte aus einer .CSV Datei (mit ";" getrennt) und übergebe diese dann einer funktion, wo ich ein ";" und eine gewisse Anzahl (Anzahl=Statische Länge - Länge String) "\x00" anhänge.

Bash Skript:
PHP:
#!/bin/bash

i=0

#-----------------------------------------------------------------------
# set IFS empty ("\n" fix)
#-----------------------------------------------------------------------
IFS=""

#-----------------------------------------------------------------------
# set binary database
#-----------------------------------------------------------------------
file="binary_db"

#-----------------------------------------------------------------------
# if binary database exist -> rm
#-----------------------------------------------------------------------
if [[ -e $file ]]; then
        rm $file
fi

#-----------------------------------------------------------------------
# function to fill binary database
#-----------------------------------------------------------------------
function field() {
	#---------------------------------------------------------------
	# declare function parameter 1, 2
	#---------------------------------------------------------------
        field_value=$1';'
        field_length=$2
	#---------------------------------------------------------------
	# identify number of "\x00" for every record
	#---------------------------------------------------------------
        zero=`echo $[$field_length-${#field_value}]`
	#---------------------------------------------------------------
	# write value of record (";" included)
	#---------------------------------------------------------------
        printf "$field_value" >> $file
	#---------------------------------------------------------------
	# write needed "\x00"
	#---------------------------------------------------------------
        for ((j=0;$j<$zero;j++)); do (printf "\x00") >> $file; done
}

#-----------------------------------------------------------------------
# read every record (line) from .csv file
#-----------------------------------------------------------------------
while read LINE
do
        field `printf "%06d" $i` 7
	#---------------------------------------------------------------
	# fetch record from .csv
	#---------------------------------------------------------------
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $1) }'` 9
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $2) }'` 26
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $3) }'` 41
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $4) }'` 51
        field `printf "$LINE" | gawk -F ';' '{ printf("%02d", $5) }'` 3
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $6) }'` 8
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $7) }'` 11
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $8) }'` 16
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $9) }'` 16
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $10) }'` 11
        field `printf "$LINE" | gawk -F ';' '{ printf("%s", $11) }'` 51
        field `printf "$LINE" | gawk -F ';' '{ printf("%c", $12) }'` 2
		
	#---------------------------------------------------------------
	# count ID +1
	#---------------------------------------------------------------
        ((i++))
done < ./binary_db.csv.bak

Das Problem ist jetzt, wenn ein Record von der .CSV Datei leer ist, bekomme ich immer den 2. Parameter im Script zurück!
Bsp.: (field `printf "$LINE" | gawk -F ';' '{ printf("%s", $9) }'` 16) wird im Script zu 16. Also $1=$2!

Wie kann ich verhindern, dass wenn der Parameter $1 leer ist, nicht der eigentlich zweite Parameter $2 also Parameter $1 betrachtet wird?

Gruss mjnet
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Ok hab die Lösung in meinem Fall:
Einfach die beiden Parameter vertauschen, weil der einte Paramter muss ja immer >0 sein in meinem Fall.

Aber wie wäre es generell?
 
Zuletzt bearbeitet:
Hi,

Aber wie wäre es generell?
ich hatte diesen Thread schon vor laengerem kurz ueberflogen, hatte aber nicht verstanden was du eigentlich willst. Jetzt hab ich's begriffen. ;)

Ein einfacher Trick/Hack waere einfach beim Funktionsaufruf einen festen String mitzugeben, den du vor der Benutzung wieder abziehst:
Code:
function field() 
{
    # strip 'a' from first parameter (if there is an 'a')
    var=${1#a} 
}

field a$(echo foo) bla blub
So ist garantiert dass der erste Parameter bei Funktionsaufruf nie leer ist. Allerdings muss man dann auch darauf achten dass man immer 'a' beim Aufruf voran stellt, jedenfalls wenn 'a' auch in der Variable selbst vorkommen kann.

Man kann den vorangestellten String je nach Art des Parameters natuerlich auch so waehlen dass es nicht dramatisch ist wenn man ihn weg laesst. Z.B. wenn die Variable eh numerisch ist, oder die Variable programmlogisch bedingt nie mit 'a' Anfangen kann.

mfg,
bytepool
 

Ähnliche Themen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Debian Routing Problem

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

dovecot und postfix Konfiguration Problem

Windows clients können nicht mehr auf lange laufendes System zugreifen

Zurück
Oben