BASH: instr() funktion gesucht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
BerndHohmann
Beiträge: 70
Registriert: 17.02.2015 23:26:44
Wohnort: Nidderau
Kontaktdaten:

BASH: instr() funktion gesucht

Beitrag von BerndHohmann » 25.02.2015 22:40:33

Steh bisserl auf dem Schlauch (und das mir nach 30 Jahren Programmierung...)

Was ist das INSTR äquivalent in Bash?

Ich hab zb. einen String "#BRC" und will wissen ob "C" darin vorkommt.

Es geht da um eine angedachte Steuerdatei vom Typ

Code: Alles auswählen

#BRC host.domain.tld
("Comment/Backup/Reboot/Check") und dann im Crontab

Code: Alles auswählen

mytool $steuerdatei backup
reinstellen damit alle Hosts mit "B" einem Backup unterzogen werden.

Bernd

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: BASH: instr() funktion gesucht

Beitrag von newdeb » 26.02.2015 01:09:15

Code: Alles auswählen

STR='#BRC'
if [[ "$STR" == *C* ]]; then
...
fi

case "$STR" in 
*C*) ...
...
esac

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: BASH: instr() funktion gesucht

Beitrag von Meillo » 26.02.2015 10:03:31

newdeb hat geschrieben:

Code: Alles auswählen

STR='#BRC'
if [[ "$STR" == *C* ]]; then
...
fi
Das sollte von den meisten modernen Shells unterstuetzt werden, wenn man auch eines der beiden Gleichheitszeichen entfernen sollte.

Code: Alles auswählen

case "$STR" in 
*C*) ...
...
esac
Diese Variante ist portabel.
Use ed once in a while!

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: BASH: instr() funktion gesucht

Beitrag von newdeb » 26.02.2015 13:33:23

Meillo hat geschrieben:
newdeb hat geschrieben:

Code: Alles auswählen

STR='#BRC'
if [[ "$STR" == *C* ]]; then
...
fi
Das sollte von den meisten modernen Shells unterstuetzt werden, wenn man auch eines der beiden Gleichheitszeichen entfernen sollte.
Es gibt Shells, die zu diesem Punkt etwas eigensinnige Ansichten haben:

Code: Alles auswählen

$ ksh -nc '[[ foo = bar ]]'
ksh: warning: line 1: '=' obsolete, use '=='

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: BASH: instr() funktion gesucht

Beitrag von Meillo » 26.02.2015 14:04:56

newdeb hat geschrieben: Es gibt Shells, die zu diesem Punkt etwas eigensinnige Ansichten haben:

Code: Alles auswählen

$ ksh -nc '[[ foo = bar ]]'
ksh: warning: line 1: '=' obsolete, use '=='
Welche ksh ist das denn?

Die mksh in Debian stable (@(#)MIRBSD KSH R40 2012/07/20 Debian-7) warnt hier nicht und hat auch in der Manpage in den Beispielen ueberall einzelne Gleichheitszeichen (woraus ich schliesse, dass das die bevorzugte Variante ist).
Use ed once in a while!

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: BASH: instr() funktion gesucht

Beitrag von Phineas » 26.02.2015 15:16:24

Gibt instr() nicht eine Position zurück, wenn was gefunden wurde?

Kann man sich selber bauen:

Code: Alles auswählen

instr(){
    local p="${1%${2}*}"
    (( ${#p} != ${#1} )) && echo $(( ${#p} + 1 ))
}

# Test:
instr 1234567890 456
Gibt nichts zurück, wenn nichts gefunden wurde.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: BASH: instr() funktion gesucht

Beitrag von Meillo » 26.02.2015 16:01:51

Phineas hat geschrieben:Gibt instr() nicht eine Position zurück, wenn was gefunden wurde?
Ich denke, dass der Hinweis auf instr() nur zur Information, nicht aber als Anforderung gemeint war. Zumindest scheint es fuer das konkrete Problem des Fragenden nur wichtig zu sein *ob* es ein Substring ist.
Kann man sich selber bauen:

Code: Alles auswählen

instr(){
    local p="${1%${2}*}"
    (( ${#p} != ${#1} )) && echo $(( ${#p} + 1 ))
}

# Test:
instr 1234567890 456
Danke! Ich find's ja immer gut, wenn noch ein bisschen ``rumgespielt' wird, nachdem das Problem geloest ist (was ja scheinbar der Fall ist).

Deinen Vorschlag muss ich ``nett'' finden ... wie alles was ich als Leistung schaetze, aber leider ausserhalb meiner Welt liegt (in diesem Fall, weil unportabeles Shellscripting). Das soll nicht abwertend verstanden werden. Ich find's super, dass du den Vorschlag gemacht hast, und ich finde ihn auch nicht uebel an sich (selbst wenn ich mich mit so Bashisms nicht auskenne). Insbesondere hast du mich damit aber motiviert auch eine (und zwar auf awk basierende) instr()-Implementierung in Form einer Shell-Funktion zu liefern:

Code: Alles auswählen

instr() { awk "BEGIN{print index($1,$2)}";}
Gibt nichts zurück, wenn nichts gefunden wurde.
Das ist leider oft unguenstig. Meist ist es besser einen invaliden Wert (hier z.B. 0) zurueck zuliefern, denn in der Shell ``verschwinden'' sonst manchmal Parameter.
Use ed once in a while!

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: BASH: instr() funktion gesucht

Beitrag von newdeb » 26.02.2015 17:37:25

Meillo hat geschrieben: Welche ksh ist das denn?
Die AT&T - ksh93 :

Code: Alles auswählen

ii  ksh     93u+20120801-1   amd64      Real, AT&T version of the Korn shell

Benutzeravatar
BerndHohmann
Beiträge: 70
Registriert: 17.02.2015 23:26:44
Wohnort: Nidderau
Kontaktdaten:

Re: BASH: instr() funktion gesucht

Beitrag von BerndHohmann » 26.02.2015 20:31:49

Phineas hat geschrieben:Gibt instr() nicht eine Position zurück, wenn was gefunden wurde?
Ja, aber wie Markus schon richtig erkannt hat würde das im von mir kurz beschriebenen Szenario wenig nützlich sein die Position zurückzugeben weil es nur um die Unterscheidung "drin oder nicht drin" geht.

Code: Alles auswählen

case "$STR" in
*C*) ...
...
esac
sieht passend aus und gefällt mir deshalb so gut, weil man sofort sieht was genau passiert.

Bernd

Antworten