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

Shellskript: Variablen vergleichen und ändern

dukenuker

Newbie
Hallo Leute,

folgendens Problem: ich habe zewi Variablen namens TAB_KNOWN und TAB_AKT. In TAB_KNOWN sind alle bekannten Tabellennamen enthalten, in TAB_AKT alle verfügbaren Tabellennamen. Die Tabellennamen in TAB_AKT sollen mit denen in TAB_KNOWN verglichen werden. Falls eine Tabellenname aus TAB_AKT nicht in TAB_KNOWN enthalten ist, so soll er aus TAB_AKT entfernt werden.

Bsp:
Inhalt in TAB_AKT:

name1 name2 name3 name4 name5 name6 name7

Inahlt in TAB_KNOWN:

name1 name2 name4 name5 name7 name8 name9

Neue TAB_AKT.

name1 name2 name4 name5 name7


Danke für Eure Hilfe.

Grüße
Simon
 
A

Anonymous

Gast
zB so hier (ungetestet)
Code:
for i in `cat TAB_AKT`
do
  if grep $i TAB_KNOWN > /dev/null
    then
      echo $i >> TAB_AKT_NEU
    fi
done
# mv TAB_AKT_NEU TAB_AKT

ist nicht ganz vollkommen, da mit grep eventuell zu viel gefunden wird, kommt also auf die Struktur der Tabellennamen an, ist aber durchaus ausbaufähig.


(edit) sehe grade es steht ja nicht in Dateien sondern in Variablen.
sieht es etwas anders aus(ebenfalls ungetestet, hab grad nur Windows hier)
Code:
TAB_AKT_NEU=
for i in `echo $TAB_AKT`
do
  if echo $TAB_KNOWN | grep $i   > /dev/null
    then
      TAB_AKT_NEU="$TAB_AKT_NEU $i"
    fi
done
#TAB_AKT=$TAB_AKT_NEU


robi
 
Ich war so frei und hab das mal getestet:
Code:
#!/bin/bash
TAB_AKT="name1 name2 name3 name4 name5 name6 name7";
TAB_KNOWN="name1 name2 name4 name5 name7 name8 name9";
TAB_AKT_NEU="";

for i in $TAB_AKT; do
   if echo $TAB_KNOWN | grep $i > /dev/null ;
     then TAB_AKT_NEU="$TAB_AKT_NEU $i";
   fi;
done;

TAB_AKT=$TAB_AKT_NEU;
echo "$TAB_AKT";
=> Läuft!
 
OP
dukenuker

dukenuker

Newbie
hat geklappt, danke schön. eine frage noch: bei
Code:
if echo $TAB_KNOWN | grep $i > /dev/null
ist kein test vorhanden, aber auch keine eckige klammer. wieso klappt das dann?

Danke für die Antwort.

Grüße
Simon
 
A

Anonymous

Gast
if wertet nur aus, ob der letzte Befehl eine NULL ( also korrekt beendet) oder einen Wert ungleich NULL ( also mit einem Fehler beendet) als Rückgabewert geliefert hat. Hier in diesem Beispiel ist der letzte Befehl das grep, dessen Wert if auswertet.

Test macht weiter gar nicht, als genau diese Rückgabewerte zu liefern, allerdings sind damit eine ganze Reihe von verschiedenen Tests möglich, für die man sonst immer spezielle kleine Programme benötigen würde.
Test ist also nur ein Hilfsprogramm, das entsprechend dem das er testen oder vergleichen soll eine 0 oder 1 als Rückgabewert liefert.
Die eckige Klammer ihrerseits ist zumindestens die öffnende ein Hardlink auf /usr/bin/test kannst du leicht nachvollziehen wenn du
Code:
which [
ls -l /usr/bin/[
aufrufst, das erklärt auch warum vor und nach der eckigen Klammer auch immer ein Leerzeichen stehen muss.

robi
 
Oben