সবচেয়ে সহজ নয় , তবে আপনি এর মতো কিছু করতে পারেন:
$ IP=109.96.77.15
$ echo "$((${-+"(${IP//./"+256*("}))))"}&255))"
109
$ echo "$((${-+"(${IP//./"+256*("}))))"}>>8&255))"
96
$ echo "$((${-+"(${IP//./"+256*("}))))"}>>16&255))"
77
$ echo "$((${-+"(${IP//./"+256*("}))))"}>>24&255))"
15
যে ksh93 কাজ করা উচিত (যেখানে যে ${var//pattern/replacement}
অপারেটর থেকে আসে), bash
4.3+,, busybox sh
, yash
, mksh
এবং zsh
, যদিও অবশ্যই মধ্যে zsh
, সেখানে অনেক সহজ পন্থা আছে । এর পুরানো সংস্করণগুলিতে bash
আপনাকে অভ্যন্তরীণ উদ্ধৃতিগুলি সরিয়ে ফেলতে হবে। এটি বেশিরভাগ অন্যান্য শেলগুলিতে মুছে ফেলা সেই অভ্যন্তরীণ উদ্ধৃতিগুলির সাথে কাজ করে তবে ksh93 নয়।
এটি ধরে নেওয়া হয়েছে যে $IP
একটি আইপিভি 4 ঠিকানার বৈধ কোয়াড-দশমিক উপস্থাপনা রয়েছে (যদিও এটি কোয়াড-হেক্সাডেসিমাল উপস্থাপনার জন্যও কাজ করবে 0x6d.0x60.0x4d.0xf
(এবং কিছু শেলের মধ্যে অষ্টালও তবে দশমিকের মধ্যে মানগুলি আউটপুট করবে))। যদি বিষয়বস্তু $IP
কোনও অবিশ্বস্ত উত্স থেকে আসে তবে তা কমান্ড ইঞ্জেকশন দুর্বলতার পরিমাণ।
মূলত, আমরা প্রতিটির সাথে প্রতিস্থাপন .
করার $IP
সাথে সাথে +256*(
আমরা মূল্যায়নটি শেষ করি:
$(( (109+256*(96+256*(77+256*(15))))>> x &255 ))
সুতরাং আমরা IPv4 ঠিকানার মতো those বাইটের মধ্যে একটি 32 বিট পূর্ণসংখ্যার অবশেষে তৈরি করছি (যদিও বাইটগুলি বিপরীত করা হয়েছে) then এবং তারপরে >>
, &
প্রবাহিত অপারেটরগুলি ব্যবহার করে প্রাসঙ্গিক বাইটগুলি বের করতে পারেন।
আমরা ${param+value}
স্ট্যান্ডার্ড অপারেটরটি ব্যবহার করি (এখানে $-
যা সর্বদা সেট করার নিশ্চয়তা দেওয়া আছে) ঠিক এর পরিবর্তে value
অন্যথায় পাটিগণিত বিশিষ্ট পার্থক্যের সাথে মিল নেই complain এখানে শেলটি ))
খোলার জন্য সমাপনীটি খুঁজে পেতে পারে $((
এবং তারপরে অভ্যন্তরীণ প্রসারগুলি সম্পাদন করতে পারে যার ফলশ্রুতিতে পাটিগণিতের প্রকাশ ঘটে।
সঙ্গে $(((${IP//./"+256*("}))))&255))
পরিবর্তে, শেল দ্বিতীয় ও তৃতীয় আচরণ করবেন )
ক্লোজিং সেখানে গুলি ))
জন্য $((
এবং একটি বাক্য গঠন ত্রুটি প্রতিবেদন করুন।
Ksh93 এ, আপনি এটি করতে পারেন:
$ echo "${IP/@(*).@(*).@(*).@(*)/\2}"
96
bash
, mksh
, zsh
Ksh93 এর অনুলিপি করেছেন ${var/pattern/replacement}
অপারেটর কিন্তু যে না ক্যাপচার-গ্রুপ অংশ হ্যান্ডলিং। zsh
এটি একটি ভিন্ন বাক্য গঠন সহ সমর্থন করে:
$ setopt extendedglob # for (#b)
$ echo ${IP/(#b)(*).(*).(*).(*)/$match[2]}'
96
bash
এর রিজেক্সএক্স ম্যাচিং অপারেটরে ক্যাপচার গ্রুপ হ্যান্ডলিংয়ের কিছু ফর্ম সমর্থন করে , কিন্তু এতে নেই ${var/pattern/replacement}
।
প্যাসিকলি, আপনি ব্যবহার করতে চাই:
(IFS=.; set -o noglob; set -- $IP; printf '%s\n' "$2")
noglob
মান জন্য খারাপ চমকের এড়াতে $IP
মত 10.*.*.*
subshell, বিকল্প এবং যারা পরিবর্তন করার সুযোগ সীমিত করতে $IFS
।
¹ একটি আইপিভি 4 ঠিকানা কেবল একটি 32 বিট পূর্ণসংখ্যা এবং 127.0.0.1 উদাহরণস্বরূপ অনেকের মধ্যে একটি (যদিও সর্বাধিক সাধারণ) পাঠ্য উপস্থাপনা। লুপব্যাক ইন্টারফেসের একই সাধারণ আইপিভি 4 ঠিকানাটি 0x7f000001 বা 127.1 হিসাবে প্রতিনিধিত্ব করা যেতে পারে (এটি সম্ভবত 1
127.0 / 8 ক্লাস এ নেটওয়ার্কের ঠিকানা হিসাবে বলা যেতে পারে ), বা 0177.0.1, বা 1 এর অন্যান্য সংমিশ্রণগুলি অষ্টাল, দশমিক বা হেক্সাডেসিমাল হিসাবে প্রকাশিত 4 টি সংখ্যা। ping
উদাহরণস্বরূপ আপনি এই সমস্তগুলিতে পাস করতে পারেন এবং আপনি দেখতে পাবেন যে তারা সমস্ত লোকালহোস্টে পিং করবে।
যদি আপনি সালিসি অস্থায়ী পরিবর্তনশীল (এখানে $n
) সেট করার পার্শ্ব প্রতিক্রিয়াটিকে কিছু মনে করেন না , bash
বা ksh93
বা zsh -o octalzeroes
বা lksh -o posix
, আপনি কেবলমাত্র এই সমস্ত উপস্থাপনাগুলি 32 বিট পূর্ণসংখ্যার সাথে ফিরে রূপান্তর করতে পারেন:
$((n=32,(${IP//./"<<(n-=8))+("})))
এবং তারপরে উপরের মতো >>
/ &
সংমিশ্রণ সহ সমস্ত উপাদানগুলি বের করুন ।
$ IP=0x7f000001
$ echo "$((n=32,(${IP//./"<<(n-=8))+("})))"
2130706433
$ IP=127.1
$ echo "$((n=32,(${IP//./"<<(n-=8))+("})))"
2130706433
$ echo "$((n=32,((${IP//./"<<(n-=8))+("}))>>24&255))"
127
$ perl -MSocket -le 'print unpack("L>", inet_aton("127.0.0.1"))'
2130706433
mksh
পাটিগণিতের বহিঃপ্রকাশের জন্য স্বাক্ষরিত 32 বিট ইন্টিজার ব্যবহার করে, আপনি $((# n=32,...))
স্বাক্ষরবিহীন 32 বিট সংখ্যার (এবং এর posix
জন্য অক্টাল ধ্রুবকগুলি সনাক্ত করার বিকল্প) ব্যবহার করতে বাধ্য করতে পারেন ।
IFS
জন্যread
আছে:IFS=. read -a ArrIP<<<"$IP"