Ungültige Option für grep im Shell-Script
Hallo, ich habe hier ein kleines Problem mit einem Shellscript. Das Script ist unter der URL http://pastebin.de/2916 zu finden. Die kritischen Stellen des Scripts sind die Variablen CSN und COOKIE, die Ausgabe sollte wie das Ergebnis des folgenden echo Befehls sein. echo "rid=099,csn=$(grep contextCSN Master.ldif | cut -c13-52)" rid=099,csn=20100101163523.139663Z#000000#000#000000 Wenn ich das Script ausführe, bekomme ich nachstehende Fehlermeldung für grep: ,----[ synctest.sh Ausgabe ] | ./synctest.sh | + SEARCH=/opt/openldap/bin/ldapsearch | + HOST=ldap://localhost | + BASE=o=avci,c=de | + BINDDN=replicator | + BINDPW=geheim | + ATTRS=1.1 | + MASTER=Master.ldif | + CSN='grep -e contextCSN Master.ldif | cut -c13-52' | ++ grep -e contextCSN Master.ldif '|' cut -c13-52 | grep: Ungültige Option -- - | Aufruf: grep [OPTION]... MUSTER [DATEI]... | »grep --help« gibt Ihnen mehr Informationen. | + COOKIE=rid=099,csn= | + /usr/bin/ldapsearch -H ldap://localhost -Y DIGEST-MD5 -U replicator -w geheim -b ou=adressbuch,o=avci,c=de -s one '-E!sync=ro/rid=099,csn=' 1.1 2 `---- Der Cookie wird nicht zusammengesetzt. Wo ist der Denkfehler? -Dieter -- Dieter Klünter | Systemberatung http://dkluenter.de GPG Key ID:8EF7B6C6 53°37'09,95"N 10°08'02,42"E -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
"Dieter Kluenter"
Hallo, ich habe hier ein kleines Problem mit einem Shellscript. Das Script ist unter der URL http://pastebin.de/2916 zu finden. Die kritischen Stellen des Scripts sind die Variablen CSN und COOKIE, die Ausgabe sollte wie das Ergebnis des folgenden echo Befehls sein.
echo "rid=099,csn=$(grep contextCSN Master.ldif | cut -c13-52)" rid=099,csn=20100101163523.139663Z#000000#000#000000
Das Script habe ich etwas vereinfacht, die funktionierende Lösung ist unter dieser URL zu finden: http://pastebin.de/2917 -Dieter -- Dieter Klünter | Systemberatung http://dkluenter.de GPG Key ID:8EF7B6C6 53°37'09,95"N 10°08'02,42"E -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Son, 03 Jan 2010, Dieter Kluenter schrieb:
"Dieter Kluenter"
writes: Das Script habe ich etwas vereinfacht, die funktionierende Lösung ist unter dieser URL zu finden: http://pastebin.de/2917
Wie sieht denn die Zeile mit dem contextCSN überhaupt aus? Nur genereller Hinweis: cut -c sollte man vermeiden. Für solch Aufgaben eignen sich sed und v.a. awk (die jew. auch gleich das grep ersetzen). Und Variablen sollte man immer quoten, wenn irgendwie möglich. -dnh -- Wer heiratet kann Sorgen teilen, die er vorher nicht hatte. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo David,
David Haller
Hallo,
Am Son, 03 Jan 2010, Dieter Kluenter schrieb:
"Dieter Kluenter"
writes: Das Script habe ich etwas vereinfacht, die funktionierende Lösung ist unter dieser URL zu finden: http://pastebin.de/2917 Wie sieht denn die Zeile mit dem contextCSN überhaupt aus?
contextCSN: 20100101163523.139663Z#000000#000#000000 zu beachten ist hier der Space zwischen dem Attribut und dem Wert, der Space darf von grep nicht übermittelt werden, daher die Lösung mit cut.
Nur genereller Hinweis: cut -c sollte man vermeiden. Für solch Aufgaben eignen sich sed und v.a. awk (die jew. auch gleich das grep ersetzen). Und Variablen sollte man immer quoten, wenn irgendwie möglich.
Da es sich im LDIF handelt, ist das Datenformat fest definiert, nur auf dieser Basis habe ich mich für cut entschieden. Mit Quoten habe ich es versucht, das führt aber zu etlichen Fehlermeldungen. Mit der bestehenden, funktionierenden Lösung bin ich auch nicht zufrieden, aber etwas besseres ist mir nicht eingefallen. Wenn du eine andere Lösung hast, bitte her damit. -Dieter -- Dieter Klünter | Systemberatung http://dkluenter.de GPG Key ID:8EF7B6C6 53°37'09,95"N 10°08'02,42"E -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Son, 03 Jan 2010, Dieter Kluenter schrieb:
David Haller
writes: Am Son, 03 Jan 2010, Dieter Kluenter schrieb:
"Dieter Kluenter"
writes: Das Script habe ich etwas vereinfacht, die funktionierende Lösung ist unter dieser URL zu finden: http://pastebin.de/2917 Wie sieht denn die Zeile mit dem contextCSN überhaupt aus?
contextCSN: 20100101163523.139663Z#000000#000#000000
zu beachten ist hier der Space zwischen dem Attribut und dem Wert, der Space darf von grep nicht übermittelt werden, daher die Lösung mit cut.
Ah. Simpel.
Nur genereller Hinweis: cut -c sollte man vermeiden. Für solch Aufgaben eignen sich sed und v.a. awk (die jew. auch gleich das grep ersetzen). Und Variablen sollte man immer quoten, wenn irgendwie möglich.
Da es sich im LDIF handelt, ist das Datenformat fest definiert, nur auf dieser Basis habe ich mich für cut entschieden. Mit Quoten habe ich es versucht, das führt aber zu etlichen Fehlermeldungen. Mit der bestehenden, funktionierenden Lösung bin ich auch nicht zufrieden, aber etwas besseres ist mir nicht eingefallen. Wenn du eine andere Lösung hast, bitte her damit.
Du hast halt sehr eigenartig gequoted bzw. die Befehle unübersichtlich verschachtelt. ==== #!/bin/bash # $Id: synctest.sh,v 1.4 2010/01/03 10:38:21 dieter Exp dieter $ set -x DATA="foo contextCSN: 20100101163523.139663Z#000000#000#000000 bar " SEARCH="/opt/openldap/bin/ldapsearch" SEARCH=echo ### DNH: dummy-cmd HOST="ldap://localhost" BASE="o=avci,c=de" BINDDN="replicator" BINDPW="geheim" ATTRS="1.1" MASTER="Master.ldif" CSN="$(awk -F': ' '/contextCSN/{print $2;}' "$MASTER")" CSN="$(echo "$DATA" | awk -F': ' '/contextCSN/{print $2;}')" ### DNH: dummy-cmd COOKIE="rid=099,csn=${CSN}" # ### Alternativ zusammenfassen: # COOKIE="rid=099,csn=$(awk -F': ' '/contextCSN/{print $2;}' "$MASTER")" "$SEARCH" -H "$HOST" -Y DIGEST-MD5 -U "$BINDDN" -w "$BINDPW" \ -b "$BASE" -s one -E"!sync=ro/${COOKIE}" "$ATTRS" ==== Die markierten Zeilen sind jew. zu löschen, da ich weder ldap noch ne .ldif hier hab ;) Als Feld-Trenner könnte man auch ne Regex verwenden (das kann perl nicht beim auto-split ;), falls nach dem ':' mehr als ein Leerzeichen vorkommen kann, zusammen mit möglichen Tabs: awk -F':[[:space:]]+' '/contextCSN/{print $2;}' Das ist auch robust gegen ':' im CSN, nur ":" plus whitespace darf nicht vorkommen. HTH, -dnh PS: ach, du bist auch ein Selbst-anpass-und-nach-/opt-Installierer? Ich verwende inzwischen vorzugsweise /opt/appname/version/ als prefix und Env-/Wrapperscripte in ~/bin/ oder /usr/local/bin (je nach Anwendungsfall). Alternativ /opt/appname-version + symlink /opt/appname. -- "Reality is that which, when you stop believing in it, doesn't go away". -- Philip K. Dick -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo David,
David Haller
Hallo,
Am Son, 03 Jan 2010, Dieter Kluenter schrieb:
David Haller
writes: Am Son, 03 Jan 2010, Dieter Kluenter schrieb:
"Dieter Kluenter"
writes: [...] zu beachten ist hier der Space zwischen dem Attribut und dem Wert, der Space darf von grep nicht übermittelt werden, daher die Lösung mit cut. Ah. Simpel.
Du hast halt sehr eigenartig gequoted bzw. die Befehle unübersichtlich verschachtelt.
Da wird meine Denkstruktur widergespiegelt :-)
==== [...] MASTER="Master.ldif" CSN="$(awk -F': ' '/contextCSN/{print $2;}' "$MASTER")" CSN="$(echo "$DATA" | awk -F': ' '/contextCSN/{print $2;}')" ### DNH: dummy-cmd COOKIE="rid=099,csn=${CSN}" # ### Alternativ zusammenfassen: # COOKIE="rid=099,csn=$(awk -F': ' '/contextCSN/{print $2;}' "$MASTER")"
Danke für die Hilfe, das erzielt das gewünschte Ergebnis.
"$SEARCH" -H "$HOST" -Y DIGEST-MD5 -U "$BINDDN" -w "$BINDPW" \ -b "$BASE" -s one -E"!sync=ro/${COOKIE}" "$ATTRS" ====
Bei diesem quoten der -E Parameter tritt ein Fehler auf, daher habe ich in meiner Version auf Quoten verzichtet. ,---- | ./synctest.sh | + SEARCH=/opt/openldap/bin/ldapsearch | + HOST=ldap://localhost | + BASE=o=avci,c=de | + BINDDN=replicator | + BINDPW=geheim | + ATTRS=1.1 | + MASTER=Master.ldif | ++ awk '-F: ' '/contextCSN/{print $2}' Master.ldif | + CSN=20100101163523.139663Z#000000#000#000000 | + COOKIE=rid=099,csn20100101163523.139663Z#000000#000#000000 | + /opt/openldap/bin/ldapsearch -H ldap://localhost -Y DIGEST-MD5 -U replicator | -w geheim -b o=avci,c=de -s sub | '-E!sync=ro/rid=099,csn20100101163523.139663Z#000000#000#000000' 1.1 `---- (Der Zeilenumbruch ist von mir) Wie du erkennst, wird der Parameter -E mit dem gesamten Rattenschwanz in single Ticks eingebunden, damit hat die BER-Kodierung dann Schwierigkeiten, denn die Ticks sind nicht ASN1-Konform.
Als Feld-Trenner könnte man auch ne Regex verwenden (das kann perl nicht beim auto-split ;), falls nach dem ':' mehr als ein Leerzeichen vorkommen kann, zusammen mit möglichen Tabs:
awk -F':[[:space:]]+' '/contextCSN/{print $2;}'
Das ist auch robust gegen ':' im CSN, nur ":" plus whitespace darf nicht vorkommen.
Der Doppelpunkt ':' ist Bestandteil von LDIF, es können auch zwei '::' wobei der erste ':' das Ende des Attributtyps markiert, der zweite ':' den Beginn eines base64-kodierten Wertes, daher lasse ich deine zweite Version lieber,
PS: ach, du bist auch ein Selbst-anpass-und-nach-/opt-Installierer? Ich verwende inzwischen vorzugsweise /opt/appname/version/ als prefix und Env-/Wrapperscripte in ~/bin/ oder /usr/local/bin (je nach Anwendungsfall). Alternativ /opt/appname-version + symlink /opt/appname.
Ja, so mache ich das auch, hier mal eine kleine Liste meines /opt Verzeichnisses: :/opt> ll insgesamt 44 apacheds-1.5.2 glassfish kde3 openldap openldap-2.4 opensso samba shibboleth web2ldap dieter@rubin:/opt> -Dieter -- Dieter Klünter | Systemberatung http://dkluenter.de GPG Key ID:8EF7B6C6 53°37'09,95"N 10°08'02,42"E -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 04 Jan 2010, Dieter Kluenter schrieb:
David Haller
writes: Am Son, 03 Jan 2010, Dieter Kluenter schrieb:
David Haller
writes: Am Son, 03 Jan 2010, Dieter Kluenter schrieb:
"Dieter Kluenter"
writes: [...] zu beachten ist hier der Space zwischen dem Attribut und dem Wert, der Space darf von grep nicht übermittelt werden, daher die Lösung mit cut. Ah. Simpel.
Du hast halt sehr eigenartig gequoted bzw. die Befehle unübersichtlich verschachtelt.
Da wird meine Denkstruktur widergespiegelt :-)
Oha ;)
==== [...] MASTER="Master.ldif" CSN="$(awk -F': ' '/contextCSN/{print $2;}' "$MASTER")" CSN="$(echo "$DATA" | awk -F': ' '/contextCSN/{print $2;}')" ### DNH: dummy-cmd COOKIE="rid=099,csn=${CSN}" # ### Alternativ zusammenfassen: # COOKIE="rid=099,csn=$(awk -F': ' '/contextCSN/{print $2;}' "$MASTER")"
Danke für die Hilfe, das erzielt das gewünschte Ergebnis.
Gut.
"$SEARCH" -H "$HOST" -Y DIGEST-MD5 -U "$BINDDN" -w "$BINDPW" \ -b "$BASE" -s one -E"!sync=ro/${COOKIE}" "$ATTRS" ====
Bei diesem quoten der -E Parameter tritt ein Fehler auf, daher habe ich in meiner Version auf Quoten verzichtet. [..] | + COOKIE=rid=099,csn20100101163523.139663Z#000000#000#000000 | + /opt/openldap/bin/ldapsearch -H ldap://localhost -Y DIGEST-MD5 -U replicator | -w geheim -b o=avci,c=de -s sub | '-E!sync=ro/rid=099,csn20100101163523.139663Z#000000#000#000000' 1.1 `----
(Der Zeilenumbruch ist von mir) Wie du erkennst, wird der Parameter -E mit dem gesamten Rattenschwanz in single Ticks eingebunden, damit hat die BER-Kodierung dann Schwierigkeiten, denn die Ticks sind nicht ASN1-Konform.
Hä? ;) Ok, dann versuch mal: -E\!sync=ro/"${COOKIE}" oder -E\!sync=ro/${COOKIE} Bel letzterem solltest du aber sicher sein, daß im COOKIE nix böses drinsteht und auch kein Whitespace auftaucht.
Als Feld-Trenner könnte man auch ne Regex verwenden (das kann perl nicht beim auto-split ;), falls nach dem ':' mehr als ein Leerzeichen vorkommen kann, zusammen mit möglichen Tabs:
awk -F':[[:space:]]+' '/contextCSN/{print $2;}'
Das ist auch robust gegen ':' im CSN, nur ":" plus whitespace darf nicht vorkommen.
Der Doppelpunkt ':' ist Bestandteil von LDIF, es können auch zwei '::' wobei der erste ':' das Ende des Attributtyps markiert, der zweite ':' den Beginn eines base64-kodierten Wertes, daher lasse ich deine zweite Version lieber,
Ah. Dann müßte awk -F':[[:space::]*' (whitespace ist optional) passen.
:/opt> ll insgesamt 44
*g* Bei mir is's (und /usr/local/) a bisserl mehr, aber das System is auch ein bisserl älter ; -dnh -- *So viele schöne Fragezeichen in meinem Kopf* ;-) [Moritz Esser, hier] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (2)
-
David Haller
-
Dieter Kluenter