Variable Problem

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Variable Problem

Beitrag von Nokman » 13.06.2008 22:56:13

Hi ich habe ein kleines Script problem und zwar kann ich mir nicht erklären warum die Variable nicht richtig übernommen wird,
Das script

Code: Alles auswählen

#! /bin/bash
set -x
player=`sed -rn 's/[^"]*"([^"]*)";/\1/;3p' tmp2/27`
echo $player
if [ -d "player/test/" ] ;then
  echo "ist da"
echo $player > test.txt
else
  echo "ist nicht da"
echo $player > test.txt
fi
es geht um if [ -d "player/test/" ] ;then
Ausgabe

Code: Alles auswählen

nokman@gbe-clan:/games/bastel$ ./script2
++ sed -rn 's/[^"]*"([^"]*)";/\1/;3p' tmp2/27
+ player=$'test\r'
+ echo $'test\r'
test
+ '[' -d player/test/ ']'
+ echo 'ist da'
ist da
+ echo $'test\r'
Alles geht wunderbar nun ersetze ich die If zeile mit einer Variable
if [ -d "player/$player/" ] ;then

Code: Alles auswählen

nokman@gbe-clan:/games/bastel$ ./script2
++ sed -rn 's/[^"]*"([^"]*)";/\1/;3p' tmp2/27
+ player=$'test\r'
+ echo $'test\r'
test
+ '[' -d $'player/test\r/' ']'
+ echo 'ist nicht da'
ist nicht da
+ echo $'test\r'
nun die Variable heist test und wird auch übergeben aber die Überprüfung schlägt fehl warum?

Danke

Benutzeravatar
Six
Beiträge: 8069
Registriert: 21.12.2001 13:39:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Siegburg

Re: Variable Problem

Beitrag von Six » 13.06.2008 23:11:29

Du willst eine Variable in einem String evaluieren. Umschließe die Variable mit geschweiften Klammern und das Skript sollte sich wie erwartet verhalten.

Code: Alles auswählen

if [ -d "player/${player}/" ]
PS: die Bash-Konventionen sehen vor, daß Variablen groß geschrieben werden, also PLAYER. M. M. n. erhöht das die Lesbarkeit ;)
Be seeing you!

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 13.06.2008 23:26:39

wenn ich dir jetzt sage nein das problem bleibt die Abfrage ob der Ordner exestiert

Code: Alles auswählen

#! /bin/bash
set -x
PLAYER=`sed -rn 's/[^"]*"([^"]*)";/\1/;3p' tmp2/27`
echo $PLAYER
if [ -d "player/${PLAYER}/" ]
then
  echo "ist da"
echo $PLAYER > test.txt
else
  echo "ist nicht da"
echo $PLAYER > test.txt
fi
habe auch deine Anmerkung beachtet :D

Code: Alles auswählen

nokman@gbe-clan:/games/bastel$ ./script2
++ sed -rn 's/[^"]*"([^"]*)";/\1/;3p' tmp2/27
+ PLAYER=$'test\r'
+ echo $'test\r'
test
+ '[' -d $'player/test\r/' ']'
+ echo 'ist nicht da'
ist nicht da
+ echo $'test\r'

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable Problem

Beitrag von gms » 13.06.2008 23:51:17

Nokman hat geschrieben:wenn ich dir jetzt sage nein das problem bleibt die Abfrage ob der Ordner exestiert

Code: Alles auswählen

...
+ echo $'test\r'
test
...
du hast Sonderzeichen in der Variablen $PLAYER !

Code: Alles auswählen

gms1 ~ # cat x.sh
#! /bin/bash
set -x
PLAYER=$'test\r'
echo $PLAYER
gms1 ~ # bash x.sh
+ PLAYER=$'test\r'
+ echo $'test\r'
test
diese werden bei der Abfrage ob das Verzeichnis existiert nicht einfach herausgefiltert

Gruß
gms

Benutzeravatar
Six
Beiträge: 8069
Registriert: 21.12.2001 13:39:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Siegburg

Re: Variable Problem

Beitrag von Six » 13.06.2008 23:55:01

Nokman hat geschrieben:wenn ich dir jetzt sage nein das problem bleibt die Abfrage ob der Ordner exestiert
Dann sage ich: das hier

Code: Alles auswählen

[ -d "player/${PLAYER}/" ]
ist nicht das gleiche wie das hier

Code: Alles auswählen

[ -d $'player/test\r/' ]
Ich vermute, \r soll CR sein, aber das brauchst in einem Existenztest nicht. Soll heißen, darf garnicht vorkommen.
habe auch deine Anmerkung beachtet :D
Löblich ;)
Be seeing you!

Benutzeravatar
Six
Beiträge: 8069
Registriert: 21.12.2001 13:39:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Siegburg

Re: Variable Problem

Beitrag von Six » 13.06.2008 23:55:30

gms hat geschrieben:
Nokman hat geschrieben:wenn ich dir jetzt sage nein das problem bleibt die Abfrage ob der Ordner exestiert

Code: Alles auswählen

...
+ echo $'test\r'
test
...
du hast Sonderzeichen in der Variablen $PLAYER !

Code: Alles auswählen

gms1 ~ # cat x.sh
#! /bin/bash
set -x
PLAYER=$'test\r'
echo $PLAYER
gms1 ~ # bash x.sh
+ PLAYER=$'test\r'
+ echo $'test\r'
test
diese werden bei der Abfrage ob das Verzeichnis existiert nicht einfach herausgefiltert

Gruß
gms
UH, what he said ;)
Be seeing you!

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 14.06.2008 00:01:22

aber woher sol das sonderzeichen kommen bei echo gibt er es ja nicht aus?

und in der datei wo er es aussliest (tmp2/27)

Code: Alles auswählen

        class Player1
        {
                "test";
                ...
                ...
Ich vermute, \r soll CR sein, aber das brauchst in einem Existenztest nicht. Soll heißen, darf garnicht vorkommen.
da frage ich mich immer noch wie kommt es da rein? und vorallem wie bekomme ich es raus? :D

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable Problem

Beitrag von gms » 14.06.2008 00:23:47

Nokman hat geschrieben: da frage ich mich immer noch wie kommt es da rein? und vorallem wie bekomme ich es raus? :D
dürfte eine DOS/Windows Datei sein, die du da verwurschtelst.
Du kannst diese mit "dos2unix" , oder mit "tr -d "\r" umwandeln, oder du kannst auch dein sed Kommando entsprechend anpassen

Code: Alles auswählen

PLAYER=`sed -rn 's/[^"]*"([^"]*)".*/\1/p' tmp2/27`

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 14.06.2008 01:05:12

ich danke dir damit ist die arbeit von 3 tagen beendet :hail:

Ich habe nie vermutet das dosdatein einen so großen Fehler verursachen können

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 15.06.2008 01:35:46

Hi ich habe mal noch ne frage ein sed befehl womit ich aus einer Datei in zwei andere schreiben kann zwischen einen bereich
7:29:25 Player Hab_mich_lieb connected (id=3122311).
es würde nun Hab_mich_lieb in Datei 1 geschrieben werden und 3122311 in Datei 2.
nun würde ich das mit meinen schlechten Sed kenntnissen so beginnen

Code: Alles auswählen

sed 's/[^[ 12][0-9]:[0-5][0-9]:[0-5][0-9] Player] 
damit müsste er ja den Anfang raus suchen nun muss er nurnoch schauen ob connected drine vor kommt bzw Alles bis zu / connected / hinausfiltern und in Datei 1 schreiben. Nun müsste ich schauen ob [(id=] und dann damit endet [).$] und der Inhalt in Datei 2 geschrieben wird.

Das Problem was ich nun habe wie setzt man dies in eine Formel um und vorallem wie geht man mit den Sonderzeichen um bei sed.

Mfg
Nok

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable Problem

Beitrag von gms » 15.06.2008 15:27:12

für so eine "schwere" Aufgabe würde ich nicht lange mit sed herumprobieren und gleich Perl ( oder awk ) einsetzen. Mit sed bin ich daher auch nicht so wirklich fit und wahrscheinlich kann das auch eleganter gelöst werden:

Code: Alles auswählen

gms1 test # sed -n -e 's/^[0-9: ]*Player *\([^ ]*\) connected (id=\([0-9]*\)).*/\1\n\2/;t found;q;:found;P;s/^.*\n//;w datei2.txt' >datei1.txt <x.txt
gms1 test # cat datei1.txt
Hab_mich_lieb
gms1 test # cat datei2.txt
3122311
Gruß
gms

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 16.06.2008 00:12:03

mir geht es genauso ich Arbeite mich nun Langsam mit Hilfe von Büchern und dem Forum an Bash ran und versuche mich dabei erstmal auf Sed zu beschränken da es doch sehr mächtig ist

Aber danke für den Befehl werde mich nun ransetzen ihn auseinander zu nehmen :D

ps aber ein nachteil hat der sed befehl sobald eine zeile kommt die nicht dem entspricht wie sie sein sollte beendet er den sed befehl

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable Problem

Beitrag von gms » 16.06.2008 18:57:01

Nokman hat geschrieben:ps aber ein nachteil hat der sed befehl sobald eine zeile kommt die nicht dem entspricht wie sie sein sollte beendet er den sed befehl
das würde ich nicht als "Nachteil", sondern als ausgewachsenen Bug bezeichnen :lol:

so sollte es aber funktionieren:

Code: Alles auswählen

sed -n -e 's/^[0-9: ]*Player *\([^ ]*\) connected (id=\([0-9]*\)).*/\1\n\2/;t found;b;:found;P;s/^.*\n//;w datei2.txt' >datei1.txt <x.txt
Gruß
gms

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 17.06.2008 00:12:48

das würde ich nicht als "Nachteil", sondern als ausgewachsenen Bug bezeichnen :lol:
da ich versuche den befehl zu verstehen würde ich natürlich gleich mal anfragen warum ein bug?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable Problem

Beitrag von gms » 17.06.2008 08:33:39

Nokman hat geschrieben:
das würde ich nicht als "Nachteil", sondern als ausgewachsenen Bug bezeichnen :lol:
da ich versuche den befehl zu verstehen würde ich natürlich gleich mal anfragen warum ein bug?
das war halt ein eindeutiger Fehler im Script.
zuerst hatte ich folgende Kombination versucht:

Code: Alles auswählen

t found;t;: found
Demnach sollte er, wenn vorher eine Ersetzung stattgefunden hat, wegen "t found", zum Label "found" springen. Ansonsten kommt er zum zweiten "t" und sollte dort, laut Doku an das Ende springen, weil zwischen den beiden "t" Kommandos keine Ersetzung stattgefunden hat. Nachdem das so nicht funktioniert hat, vermute ich, daß ich die Doku hier falsch interpretiere.
Danach war ich schlampert und habe statt dem zweiten "t" ein "q" eingefügt, obwohl es eigentlich klar ist, daß sed dann die Bearbeitung abbricht.
Mit "b" springt er jetzt nur ans Ende und fährt dann mit der nächsten Zeile in der Bearbeitung fort.

Die erste Ersetzung erledigt die Aufteilung der Eingabezeile in zwei Zeilen, wenn hier eine Ersetzung stattfindet, dann wird zum Label "found" gesprungen, wegen "P" wird dann die erste Zeile ausgegeben, danach wird diese erste Zeile mit der zweiten Ersetzung gelöscht und mit "w datei2.txt" wird der Rest ( die zweite Zeile ) in die Datei "datei2.txt" geschrieben.

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 04.07.2008 02:08:20

Hi ich habe mal wieder ne Frage

wie könnte ich es hinbekommen das alle Ordner und deren Dateien überprüft werden nach den selben inhalt.

Also einfacher an einen bespiel gezeigt


./baum/1/player
./baum/2/player
./baum/3/player

Inhalt
./baum/1/player

Code: Alles auswählen

Auto
Auto
Bus
Baum
Auto
./baum/2/player

Code: Alles auswählen

Auto
Laufen
Bus
./baum/3/player

Code: Alles auswählen

Fahrrad
Baum
zum schluss sollen die datein so aussehen
Inhalt
./baum/1/player

Code: Alles auswählen

Auto
Bus
Baum
./baum/2/player

Code: Alles auswählen

Auto
Laufen
Bus
./baum/3/player

Code: Alles auswählen

Fahrrad
Baum
das er in jeder datei einfach nur alles was doppelt vorkommt löscht im grunde zeile für zeile vergleicht.

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 06.07.2008 02:56:42

nun nachdem ich mich mal wieder kurz rangesetzt habe bemerkte ich das es genau dafür denn schönen befehl "uniq" leider muss ich vorher immer erst die datei sortieren damit alles untereinander steht kann ich dies umgehen?

und vorallem das ich die abgeänderte datei direkt in der selben speichern kann


edit die dritte:

Code: Alles auswählen

sort `find ./id -name player` | uniq
löst das probleme was ich habe auch wenn noch alles sortiert werden muss

und mal wieder er speichert es nich ab er gibt es nur in der console richtig aus aber wenn ich nun > verwenden würde wie kann ich ihm dan sagen das er es genau in die datei schreiben soll aus der er es genommen hat?

bzw wie bekomme ich es hin das ich es im selben ordner wie es ist in eien neue datei schreibe da in die seleb schreiben aj nicht méglich sein sollte da er sie ja streamt

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable Problem

Beitrag von gms » 06.07.2008 17:42:50

"sort -u" kann sortieren und die doppelten rausfiltern und mit "find" den Rest:

Code: Alles auswählen

gms1 test # cat x.txt
Auto
Auto
Bus
Baum
Auto
gms1 test # find -name "*.txt" -exec sort -u {} > x.bak \; -exec mv x.bak {} \;
gms1 test # cat x.txt
Auto
Baum
Bus
gms1 test # 
edit: wenn die Reihenfolge nicht wichtig ist, kannst du auch "uniq -u" verwenden:

Code: Alles auswählen

gms1 test # find -name "*.txt" -exec uniq -u {} > x.bak \; -exec mv x.bak {} \;
gms1 test # cat x.txt
Bus
Baum
Auto
Gruß
gms

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 07.07.2008 02:33:58

find -name "*.txt" -exec sort -u {} > x.bak \; -exec mv x.bak {} \;
also um das auseinander zu nehmen
find = suchen | -name = suchen nach *.txt | -exec = ausführen sort -u | {} steht als platzhalter für die datei die er gerade barbeitet? | > das ergebniss in die x.bak schieben und danach mv ausführen und die x.bak wieder nach {} also den orginal namen verschieben.

nun habe ich aber das problem

Code: Alles auswählen

find ./id -name "player" -exec sort -u {} > x.bak \; -exec mv x.bak {} \;
währe nun mein code er soll nur in den ordner ./id suchen danach aber ich erhalte nur folgende meldungen und es wurde nicht ausgeführt da er anscheinend die x.bak nicht erstellt

Code: Alles auswählen

mv: cannot stat `x.bak': No such file or directory

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable Problem

Beitrag von gms » 07.07.2008 21:17:41

Nokman hat geschrieben:

Code: Alles auswählen

find ./id -name "player" -exec sort -u {} > x.bak \; -exec mv x.bak {} \;
währe nun mein code er soll nur in den ordner ./id suchen danach aber ich erhalte nur folgende meldungen und es wurde nicht ausgeführt da er anscheinend die x.bak nicht erstellt

Code: Alles auswählen

mv: cannot stat `x.bak': No such file or directory
das habe ich übersehen und mit nur einer Datei ist dieser Fehler auch nicht aufgetreten:
die Umleitung auf x.bak funktioniert natürlich anders als von mir angenommen, diese gilt hier für das komplette find-Kommando und nicht nur für das einzelne "sort -u". Nachdem also das erste "sort -u" auf die Datei x.bak umgeleitet wurde, wird diese Datei verschoben, wodurch dann auch dieser Fehler auftritt.
so dürfte dieser Fehler nicht mehr passieren:

Code: Alles auswählen

find . -name "player" -exec bash -c "sort -u {} >x.bak" \; -exec mv x.bak {} \;

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 14.08.2008 15:13:49

Erst einmal vielen dank für die ganze hilfe aber nun nach langer zeit habe ich noch ne kleinigkeit

Code: Alles auswählen

sed -n '3p' ./tmp2/1 | grep ']";'
name="=[GBE][Cpt.Kirk]= [Alpha]";
er liest zeile 3 aus der datei aus und schaut ob diese mit einen ];" endet das ist soweit ok nun wollte ich es nur aufspalten in 2 Variablen

Erstens =[GBE][Cpt.Kirk]=
Zweitens [Alpha]

Also müsste ich ihm sagen er soll die zeile von hinten nach vorne abarbeiten bis er auf ein [ Drift und diesen teile in eine variable machen


und vorallem habe ich das Problem wenn ich find arbeite das er nix findet wenn eine [] vorkommt

Code: Alles auswählen

egrep -i " =[GBE][Cpt.Kirk]=" `find . -type f -print`

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable Problem

Beitrag von gms » 14.08.2008 20:16:42

auch ein schönes Beispiel für Shell-Array's:

Code: Alles auswählen

gms@gms1 ~ $ IFS=$'\n' VAR=( $(sed -n -e '3!d;s|^\(.*\)\(\[[^\[]*\]\)";$|\1\n\2|p;q' x.txt ) )
gms@gms1 ~ $ echo -e "var1='${VAR[0]}'\nvar2='${VAR[1]}'"
var1='name="=[GBE][Cpt.Kirk]= '
var2='[Alpha]'
Die Variable IFS habe ich hier auf "newline" gesetzt und mit dem sed-Kommando habe ich ein "newline" an der richtigen Position eingefügt.
Mit dem Ausdruck "VAR=( .... )" wird dann die Array-Variable "VAR" initialisiert, wobei die Ausgabe vom sed-Kommando anhand dem Wert der IFS-Variable aufgeteilt wird.

Gruß
gms

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 15.08.2008 01:52:20

vielen dank aber häteste vieleicht noch ne idee zum find befehl das er die [] als zeichen udn nicht als strings erkennt
und vorallem habe ich das Problem wenn ich find arbeite das er nix findet wenn eine [] vorkommt

Code: Alles auswählen
egrep -i " =[GBE][Cpt.Kirk]=" `find . -type f -print`

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable Problem

Beitrag von gms » 15.08.2008 12:44:30

Nokman hat geschrieben:vielen dank aber häteste vieleicht noch ne idee zum find befehl das er die [] als zeichen udn nicht als strings erkennt
und vorallem habe ich das Problem wenn ich find arbeite das er nix findet wenn eine [] vorkommt

Code: Alles auswählen
egrep -i " =[GBE][Cpt.Kirk]=" `find . -type f -print`
probiere einmal:

Code: Alles auswählen

find . -type f -print0 | xargs -0 egrep -i " =[GBE][Cpt.Kirk]=" 
nachdem in deinem obigen Beispiel die Zeichenkette 'name="=[GBE][Cpt.Kirk]= [Alpha]";' verwendet wird, vermute ich einmal du möchtest auch nach einer solchen Zeichenkette suchen. In diesem Fall solltest du lieber

Code: Alles auswählen

find . -type f -print0 | xargs -0 grep -i "=\[GBE\]\[Cpt\.Kirk\]="
verwenden

Gruß
gms

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Variable Problem

Beitrag von Nokman » 16.08.2008 02:25:50

das problem ist nur wie bekomme ich es nun aus der Variable in die Suche hinein da die Variable es mir ja als =[GBE][Cpt.Kirk]= ausgibt und ich die Variable abändern lassen müsste dadurch

Antworten