Mein dash
Skript verwendet einen Parameter in Form von hostname:port
:
myhost:1234
Während der Port optional ist, dh:
myhost
Ich muss den Host und den Port in separate Variablen lesen. Im ersten Fall kann ich tun:
HOST=${1%%:*}
PORT=${1##*:}
Dies funktioniert jedoch nicht im zweiten Fall, wenn der Port weggelassen wurde. echo ${1##*:}
Gibt einfach den Hostnamen anstelle einer leeren Zeichenfolge zurück.
In Bash könnte ich tun:
IFS=: read A B <<< asdf:111
Das funktioniert aber nicht dash
.
Kann ich aufgeteilt auf Zeichenfolge :
in Bindestrich, ohne externe Programme aufzurufen ( awk
, tr
usw.)?
%%
macht es gierig (im Gegensatz zu%
), also tut es dies tatsächlich, zumindest teilweise; es würde nicht funktionieren mit##
.Antworten:
Mach einfach:
Möglicherweise möchten Sie das to ändern
case $1
,case ${1##*[]]}
um Werte$1
wie " zu berücksichtigen"[::1]
(eine IPv6-Adresse ohne Portteil ).Zum Teilen können Sie den Operator split + glob verwenden (lassen Sie eine Parametererweiterung nicht in Anführungszeichen), da dies schließlich der Fall ist:
(obwohl dies keine Hostnamen zulässt, die einen Doppelpunkt enthalten (wie für diese IPv6-Adresse oben)).
Dieser Split + Glob-Operator stört und verursacht den Rest der Zeit so viel Schaden, dass es nur fair erscheint, ihn bei Bedarf zu verwenden (ich stimme jedoch zu, dass die Verwendung sehr umständlich ist, insbesondere wenn man bedenkt, dass POSIX
sh
keine hat Unterstützung für lokalen Bereich, weder für Variablen ($IFS
hier) noch für Optionen (noglob
hier) (obwohlash
und Derivate wiedash
sind einige von denen , die tun (zusammen mit AT & T - Implementierungenksh
,zsh
undbash
4.4 und höher)).Beachten Sie, dass
IFS=: read A B <<< "$1"
es einige eigene Probleme gibt:-r
was bedeutet, dass der Backslash einer speziellen Verarbeitung unterzogen wird.[::1]:443
in[
und:1]:443
anstelle von[
und in die leere Zeichenfolge aufgeteilt (für die SieIFS=: read -r A B rest_ignored
oder[::1]
und benötigen würden443
(für die Sie diesen Ansatz nicht verwenden können)-d ''
inzsh
oderbash
und die Daten enthalten keine NUL-Zeichen. Beachten Sie jedoch, dass Herestrings (oder Heredocs) eine hinzufügen extra Zeilenumbruch!)zsh
(woher die Syntax stammt) undbash
, hier werden Zeichenfolgen mithilfe temporärer Dateien implementiert, sodass sie im Allgemeinen weniger effizient sind als die Verwendung von${x#y}
oder split + glob-Operatoren.quelle
Entfernen Sie einfach die
:
in einer separaten Anweisung; Entfernen Sie außerdem $ host aus der Eingabe, um den Port abzurufen:quelle
Ein anderer Gedanke:
quelle
Eine Here-Zeichenfolge ist nur eine syntaktische Verknüpfung für ein einzeiliges Here-Dokument.
quelle