শুধু কর:
case $1 in
(*:*) host=${1%:*} port=${1##*:};;
(*) host=$1 port=$default_port;;
esac
আপনি পরিবর্তন করতে পারেন case $1
থেকে case ${1##*[]]}
এর মানের জন্য অ্যাকাউন্টে $1
মত [::1]
(ছাড়া একটি IPv6 ঠিকানা বন্দর অংশ)।
বিভক্ত করতে, আপনি স্প্লিট + গ্লোব অপারেটরটি ব্যবহার করতে পারেন (প্যারামিটারের সম্প্রসারণকে অব্যক্ত রেখে দিন) এটি সর্বোপরি যা হ'ল:
set -o noglob # disable glob part
IFS=: # split on colon
set -- $1 # split+glob
host=$1 port=${2:-$default_port}
(যদিও এটি হোস্টনামগুলিতে মঞ্জুরি দেয় না যাতে কোনও কোলন থাকে (উপরের আইপিভি 6 ঠিকানার মতো))।
এই বিভক্ত + গ্লোব অপারেটরটি এই পথে চলে যায় এবং বাকি সময়গুলিকে এত বেশি ক্ষতি করে যে এটিকে কেবল ন্যায্য বলে মনে হয় যখনই এটি প্রয়োজন হবে তখনই ব্যবহার করা হবে (যদিও, আমি সম্মত হব যে এটি পজিক্সের sh
কোনও নেই বলে বিবেচনা করা খুব জটিল c স্থানীয় সুযোগ জন্য সমর্থন ভেরিয়েবল (জন্য তন্ন তন্ন $IFS
এখানে) কিংবা অপশন (জন্য noglob
এখানে) (যদিও ash
ও ডেরিভেটিভস পছন্দ dash
বেশী যে (না একসঙ্গে যেমন AT & T এর বাস্তবায়নের সঙ্গে কিছু ksh
, zsh
এবং bash
4.4 এবং উপরোক্ত))।
নোটটির IFS=: read A B <<< "$1"
নিজস্ব কয়েকটি সমস্যা রয়েছে:
- আপনি ভুলে গেছেন
-r
যার অর্থ ব্যাকস্ল্যাশ কিছু বিশেষ প্রক্রিয়াজাতকরণের মধ্য দিয়ে যাবে।
- এটা বিভক্ত হবে
[::1]:443
মধ্যে [
এবং :1]:443
পরিবর্তে [
এবং খালি স্ট্রিং (যার জন্য আপনি প্রয়োজন চাই IFS=: read -r A B rest_ignored
বা [::1]
এবং 443
(যার জন্য আপনি যে পদ্ধতির ব্যবহার করতে পারবেন না)
- এটি একটি নতুন লাইন চরিত্রের প্রথম উপস্থিতির অতীত সমস্ত কিছু ছড়িয়ে দেয়, সুতরাং এটি নির্বিচারে স্ট্রিং ব্যবহার করা যাবে না (যদি না আপনি ব্যবহার
-d ''
করেন zsh
বা bash
ডেটাতে NUL অক্ষর না থাকে তবে তবে নোট করুন যে হিস্ট্রস্ট্রিংস (বা হেরডোকস) একটি যুক্ত করে না অতিরিক্ত নিউলাইন চরিত্র!)
- ইন
zsh
(যেখানে সিনট্যাক্সটি এসেছে) এবং bash
এখানে স্ট্রিংগুলি অস্থায়ী ফাইল ব্যবহার করে প্রয়োগ করা হয়, সুতরাং এটি ${x#y}
+ গ্লোব অপারেটরগুলি ব্যবহার বা বিভক্ত করার চেয়ে সাধারণত কম দক্ষ ।