Sadece yap:
case $1 in
(*:*) host=${1%:*} port=${1##*:};;
(*) host=$1 port=$default_port;;
esac
Sen değiştirmek isteyebilirsiniz case $1
için case ${1##*[]]}
değerleri için hesaba $1
gibi [::1]
(olmadan IPv6 adresi liman kısmında).
Bölmek için split + glob operatörünü kullanabilirsiniz (bir parametre genişletmesini derecelendirilmemiş olarak bırakın).
set -o noglob # disable glob part
IFS=: # split on colon
set -- $1 # split+glob
host=$1 port=${2:-$default_port}
(ancak bu, iki nokta üst üste içeren ana makine adlarına izin vermez (yukarıdaki IPv6 adresi için olduğu gibi)).
Bu split + glob operatörü yoluna girer ve o kadar çok zarara neden olur ki , gerektiğinde sadece adil görünecektir (yine de, özellikle POSIX'in sh
hiç olmadığı düşünülerek kullanmanın çok hantal olduğunu kabul edeceğim. değişkenler için (de, yerel kapsam destek $IFS
buraya) ne amaç için ( noglob
burada) (olsa ash
türevleri gibi ve dash
birlikte AT & T uygulamaları ile (do olanlardan bazıları ksh
, zsh
ve bash
yukarıda 4,4 ve)).
Bunun IFS=: read A B <<< "$1"
birkaç sorunu olduğunu unutmayın :
- Unuttuğun
-r
bazı özel işleme tabi olacak ters eğik çizgi hangi araçları.
- o bölmek
[::1]:443
içine [
ve :1]:443
yerine [
(ve boş dize kendisi için ihtiyacım olacağını IFS=: read -r A B rest_ignored
ya [::1]
ve 443
) (bunlar için bu yaklaşımı kullanamazsınız
- Kullanmak sürece (keyfi dizeleri ile kullanılamaz nedenle, yeni satır karakteriyle ilk geçtiği geçmiş herşeyi şeritler
-d ''
halinde zsh
veya bash
ve veriler herestrings (veya heredoc boş karakter ama sonra dikkat etmeyen bir eklerim) ekstra yeni satır karakteri!)
- içinde
zsh
(sözdizimi nereden geldiğini) ve bash
genellikle kullanmaktan daha az verimli yüzden, burada dizeleri, geçici dosyaları kullanılarak uygulanan ${x#y}
veya bölünmüş + glob operatörler.