Bad Number error

D

doonot

Mitglied
Hallo Zusammen

ich habe folgendes Problem mit dieser Ausgabe
Code:
tail -1 /home/tlubrpa1/scripts/tpi_response/countfile.log==0 : bad number

This is a part from the script:

Code:
#Counter File
countfile="/home/tlubrpa1/scripts/tpi_response/countfile.log"

#CNT (Count) Variable Definieren
CNT="tail -1 $countfile"

if (( $CNT == 0 )); then
          	echo $MAILTEXT | mailx -s "$MAILHEADER" $MAILLIST
         	echo $MAILTEXT | mailx -s "$MAILHEADER" $SMSLIST
          	echo "1" > $countfile
	else
		exit
	fi

Warum gibt es mir Bad number aus, ich habe die beidne doch richtig verglichen? im Counterfile steht entweder 0 oder 1

vielen dank jungs
 
Zuletzt bearbeitet:
Versuchs mal so:
Code:
#CNT (Count) Variable Definieren
CNT=$(tail -1 $countfile)
sonst vergleichst du einfach den Ausdruck "tail -1 /pfad.../" mit "0"...

Gruss
d22
 
hi,

jup, erstens was Dizzgo schon schrieb, und zweitens, imho musst du statt (( )) [[ ]] fuer die if Abfrage benutzen. Denn (( )) wird zum Auswerten von Arithmetischen Operationen verwendet (z.B. (( y = $x + 2 )) ), und nicht zum testen auf Gleichheit, etc.
Also so:
Code:
if [[ $CNT == 0 ]]

edit:
mhh, mit (( )) scheint man auch vergleiche durchfuehren zu koennen, mal nachlesen wieso...
edit2:
Ahja, (( )) scheint die gaengige C syntax zu verstehen, also auch Vergleiche (==, !=) und bit-wise shifting (>>, <<) und so lustige Sachen. Ich frage mich nur gerade wieso man dann [[ ]] noch braucht ;)
Weiss zufaellig jemand wann man [[ ]] (( )) vorzieht, und wann nicht?

mfg,
bytepool
 
Zuletzt bearbeitet:
hammmmmmerr!!! funktioniert :) danke 1000

aber was macht er jetzt gross anders? Was bewirkt das $ und die ()`?
 
$() ist die POSIX syntax fuer command substitution, also das selbe wie ``, wobei die backticks aus Kompatibilitaets Gruenden (zu anderen Shells) mittlerweile deprecated sind, wie ich heute erst gelernt habe ;)

Mit anderen Worten, der Befehl den du dort eingibst wird ausgefuehrt, und das Ergebnis dann fuer den Befehl eingesetzt.

mfg,
bytepool
 
Zuletzt bearbeitet:
jah sohhh, das wort depreciated oder so hab ich schon 3mal gehört heute, was heisst das?

jetzt läuft alles super, vielen dank an all3 h3lf3r
 
Das Wort deprecated ist Englisch, und heisst im Software Bereich so viel wie veraltet, missbilligt. Das heisst im Grunde dass du diese Funktion nicht mehr benutzen solltest, weil sie in zukuenftigen Versionen eventuell nicht mehr dabei ist, und jetzt nur noch wegen der Abwaertskompatibilitaet zu frueheren Versionen drin ist.

mfg,
bytepool
 
Zuletzt bearbeitet:
hi,

jup, erstens was Dizzgo schon schrieb, und zweitens, imho musst du statt (( )) [[ ]] fuer die if Abfrage benutzen. Denn (( )) wird zum Auswerten von Arithmetischen Operationen verwendet (z.B. (( y = $x + 2 )) ), und nicht zum testen auf Gleichheit, etc.
Also so:
Code:
if [[ $CNT == 0 ]]
Nicht ganz richtig , denn um POSIX kompatibel zu bleiben verwende für Stringvergleich
if [ $VAR1 = $VAR2 ]
Numerischer Vergleich -gt -lt usw
Du siehst, es ist nur eine [ nötig, und das == wird nicht von allen Bash -Versionen verstanden.

Weiss zufaellig jemand wann man [[ ]] (( )) vorzieht, und wann nicht?

mfg,
bytepool

Das ist dir selbst überlassen.
Wenn es um kompatible Skripte geht, verwende
if [ ... ]

Das ist auch in der Bash wie in C für Iteration.
Code:
for (( a=0;a<5;a++)); do echo $a;done

Unter Bash 3.xx geht das aber auch so
Code:
for a in {0..4}; do echo $a; done

Näheres in der Manpage dazu.

Gruß Wolfgang
 
Ahja, gut zu wissen, danke fuer die Aufklaerung :)

mfg,
bytepool
 
@ bytepool: danke für die beschreibung

@ wolfgang, danke für deine ausführliche information. ich habe dies beachtet, und alles läuft super :)
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Rückgabe eines Befehls

HandbrakeCLI Shell Skript

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

Datei auslesen und fund per MAil versenden.

Zurück
Oben