• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Value too great - Oktalzahl in der Bash

byron1778

Hacker
Hallo Forum!

Ich würde ein wenig Hilfe benötigen.
Folgendes Problem habe ich:

Aus einer cfg Datei, welche so aussieht

Code:
01;xxx;xxx
02;xxx;xxx
bis
09;xxx;xxx

lese ich mir die erste Spalte aus und übergebe sie an eine Function, welche so aussieht:

Code:
        NUMBER=$1
        declare -a TASKFILE_
        declare -a END_
        declare -a LOGFILE_

        for i in `ls ${DATA}/spezial_${NUMBER}*.txt | cut -d_ -f2 | cut -d . -f1`
        do
                echo ${SEPARATOR}
                TASKFILE_ID=${i}
                ${ECHO} "`date +'%d/%m/%Y %H:%M:%S'` - Run Taskfile ${TASKFILE_ID}..."
                eval TASKFILE_[${i}]=${DATA}/spezial_${TASKFILE_ID}.txt
                eval END_[${i}]="END_batchtasks_${TASKFILE_ID}_`date +'%Y%m%d%H%M%S'`"
                eval LOGFILE_[${i}]="${LOGS}/run_batchMonitor_${TASKFILE_ID}_`date +'%Y%m%d%H%M%S'`"
                ${SCRIPTS}/startTaskfile.sh ${TASKFILE_ID} ${TASKFILE_[${i}]} ${END_[${i}]} ${LOGFILE_[${i}]} ${RISKENGINEPORT_1}
        done

Kommt das Programm nun zur Zeile
Code:
eval LOGFILE_[${i}]="${LOGS}/run_batchMonitor_${TASKFILE_ID}_`date +'%Y%m%d%H%M%S'`"

gibt es eine Fehlermeldung, welche besagt: value too great.
Grund ist auch klar, weil er die Zahl 01 bis 09 als Oktalzahl interpretiert!

Gibt es für mich eine Möglichkeit trotzdem mit der Zahl 07 od 08 zu arbeiten, ohne dass er es falsch interpretiert?
10# davor anhängen ist nicht möglich, da ich die führende Null benötige!

Ich verwende im Moment die Bash in der Version GNU bash, version 3.00.16(1)-release (sparc-sun-solaris2.10).

Ein declare -A geht hier auch nicht!

Danke vielmals für jede Hilfe schon!
 
Das schaut ja unheimlich aus.

Probier einmal das:
Code:
tline=""
echo "file: $1"

while read tline; do
	if [ `expr "$tline" : "\(^\w.;.*\)"` ]; then
		tline=${tline/#0/}
		echo "$tline"
	fi
done < $1
 
OP
B

byron1778

Hacker
Hallo!

Danke Dir vielmals!

Aber es passiert leider nichts, wenn ich das Programm ausführe.
Die if - Abfrage bringt mir leider kein Ergebnis:

Code:
+ read tline
+ echo '01;n;email;email;rate;4'
01;n;email;email;rate;4
++ expr '01;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
+ echo '02;n;email;email;rate;4'
02;n;email;email;rate;4
++ expr '02;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
+ echo '03;n;email;email;rate;4'
03;n;email;email;rate;4
++ expr '03;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
+ echo '04;n;email;email;rate;4'
04;n;email;email;rate;4
++ expr '04;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
+ echo '05;n;email;email;rate;4'
05;n;email;email;rate;4
++ expr '05;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
+ echo '06;y;email;email;risk'
06;y;email;email;risk
++ expr '06;y;email;email;risk' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
+ echo '07;n;email;email;risk'
07;n;email;email;risk
++ expr '07;n;email;email;risk' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
+ echo '09;y;email;email;risk'
09;y;email;email;risk
++ expr '09;y;email;email;risk' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
 
So habe ich das nicht gemeint
Schreibe das folgende in ein file mit dem Namen test:
Code:
#!/bin/sh

if ! [ -f $1 ] ; then
	echo "File $1 not found !"
	exit
fi

tline=""
declare -a varr

echo "read logfile: $1"

while read tline; do
	if [ `expr "$tline" : "\(^\w.;.*\)"` ]; then
		tline=${tline/#0/}
		varr=(`echo ${tline//;/ }`)
		echo "1: ${varr[0]}"
		echo "2: ${varr[1]}"
		echo "3: ${varr[2]}"
		echo "4: ${varr[3]}"
		echo "5: ${varr[4]}"
		echo "6: ${varr[5]}"
		echo
	fi
done < $1

Dann probiere es aus mit
# test ./dein_logfile

Dann siehst du wie es arbeitet und du kannst daran herumschrauben

Dieser ausgefuchste code unterliegt natürlich dem copyright
D.h. du mußt in den Kopf des files hineinschreiben:
Dieser code stammt von der lieben Gräfin Klara
 
OP
B

byron1778

Hacker
Hallo!

Danke dir!

Leider gibt es nichts aus.
Irgendwie trifft die Regular Expression nicht zu:

Ausgabe des Codes ( Habe es auf Bash gestellt! )

Code:
#!/bin/bash -x

if ! [ -f $1 ] ; then
   echo "File $1 not found !"
   exit
fi

tline=""
declare -a varr

echo "read logfile: $1"

while read tline; do
   if [ `expr "$tline" : "\(^\w.;.*\)"` ]; then
      tline=${tline/#0/}
      varr=(`echo ${tline//;/ }`)
      echo "1: ${varr[0]}"
      echo "2: ${varr[1]}"
      echo "3: ${varr[2]}"
      echo "4: ${varr[3]}"
      echo "5: ${varr[4]}"
      echo "6: ${varr[5]}"
      echo
   fi

Ausgabe beim Debuggen

Code:
+ '[' -f newbatch/CFG/newbatch.cfg ']'
+ tline=
+ declare -a varr
+ echo 'read logfile: newbatch/CFG/newbatch.cfg'
read logfile: newbatch/CFG/newbatch.cfg
+ read tline
++ expr '01;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
++ expr '02;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
++ expr '03;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
++ expr '04;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
++ expr '05;n;email;email;rate;4' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
++ expr '06;y;email;email;risk' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
++ expr '07;n;email;email;risk' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline
++ expr '09;y;email;email;risk' : '\(^\w.;.*\)'
+ '[' ']'
+ read tline

Der Inhalt des cfg Files ist im folgenden Format:

Code:
01;n;email;email;rate;4
02;n;email;email;rate;4
03;n;email;email;rate;4
04;n;email;email;rate;4
05;n;email;email;rate;4
06;y;email;email;risk
07;n;email;email;risk
09;y;email;email;risk

Dass die Zeilen unterschiedlich lang sind, ist in diesem Falle nebensächlich, da ich die Felder einzeln auswerte ...
Sollte also nichts mit der Regular Expression zu tun haben ...
 
Das ist ja höchstverdächtig
Probier einmal ohne
if [ `expr "$tline" : "\(^\w.;.*\)"` ]; then
und das dazugehörigen fi natürlich auch weg
 
Oben