ただやる:
case $1 in
(*:*) host=${1%:*} port=${1##*:};;
(*) host=$1 port=$default_port;;
esac
あなたは変更することができますcase $1
には、case ${1##*[]]}
の値を考慮して$1
のよう[::1]
(せずにIPv6アドレスポート部分)。
分割するには、split + glob演算子を使用できます(パラメーターの展開を引用符で囲まないでください)。
set -o noglob # disable glob part
IFS=: # split on colon
set -- $1 # split+glob
host=$1 port=${2:-$default_port}
(ただし、(上記のIPv6アドレスのように)コロンを含むホスト名は許可されません)。
そのsplit + glob演算子は邪魔になり、残りの時間に非常に大きな害を及ぼすため、必要なときにのみ使用するのは公平だと思われます(ただし、特にPOSIX sh
に変数($IFS
ここ)でもオプション(ここ)でもないローカルスコープのサポートnoglob
(ash
およびのような派生物dash
は(および、4.4 ksh
以降のAT&T実装と共に)実行するものの一部です)。zsh
bash
IFS=: read A B <<< "$1"
独自の問題がいくつかあることに注意してください。
- あなた
-r
はバックスラッシュがいくつかの特別な処理を受けることを意味することを忘れました。
- それが分かれう
[::1]:443
に[
と:1]:443
の代わりに[
、あなたが必要があると思いれる空の文字列(IFS=: read -r A B rest_ignored
または[::1]
と443
(あなたがそのアプローチを使用できないため)
- 改行文字が最初に出現した後はすべて削除されるため、任意の文字列では使用できません(またはで使用
-d ''
し、データにNUL文字が含まれていない場合を除きます)。ただし、ヒア文字列(またはヒアドキュメント)は、余分な改行文字!)zsh
bash
- in
zsh
(構文がどこから来るか)とbash
、ここでは、文字列は一時ファイルを使用して実装されるため、一般的には、${x#y}
またはsplit + glob演算子を使用するよりも効率的ではありません。