सबसे आसान नहीं है , लेकिन आप कुछ ऐसा कर सकते हैं:
$ 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+, बिजीबॉक्स sh
, yash
, mksh
और zsh
, हालांकि निश्चित रूप से में zsh
, वहाँ बहुत सरल दृष्टिकोण हैं । पुराने संस्करणों में bash
, आपको आंतरिक उद्धरण निकालने होंगे। यह उन आंतरिक उद्धरणों के साथ काम करता है जो अधिकांश अन्य गोले में भी हटाए जाते हैं, लेकिन ksh93 नहीं।
उस मान $IP
में एक IPv4 पते का एक मान्य क्वाड-दशमलव प्रतिनिधित्व होता है (हालांकि यह क्वाड-हेक्साडेसिमल निरूपण के लिए भी काम करेगा 0x6d.0x60.0x4d.0xf
(और कुछ गोले में भी अष्टक) लेकिन दशमलव में मूल्यों का उत्पादन करेगा)। यदि सामग्री $IP
एक अविश्वसनीय स्रोत से आती है, तो यह एक कमांड इंजेक्शन भेद्यता की राशि होगी।
मूल रूप से, के रूप में हम हर बदल रहे हैं .
में $IP
साथ +256*(
, हम मूल्यांकन कर अंत:
$(( (109+256*(96+256*(77+256*(15))))>> x &255 ))
इसलिए हम एक IPv4 पते की तरह उन 4 बाइट के बाहर एक 32 बिट पूर्णांक के निर्माण कर रहे हैं अंत में है (बाइट्स हालांकि साथ उलट) ¹ में और उसके बाद का उपयोग कर >>
, &
बिटवाइज़ ऑपरेटर्स प्रासंगिक बाइट्स को निकालने के लिए।
हम ${param+value}
मानक ऑपरेटर का उपयोग करते हैं ( $-
जिस पर हमेशा सेट होने की गारंटी दी जाती है) सिर्फ value
इसलिए कि अन्यथा अंकगणित पार्सर बेमेल कोष्ठक के बारे में शिकायत करेगा। यहां खोल ))
उद्घाटन के लिए समापन का पता लगा सकता है $((
, और फिर इसके अंदर विस्तार का प्रदर्शन कर सकता है जिसके परिणामस्वरूप अंकगणितीय अभिव्यक्ति का मूल्यांकन किया जाएगा।
साथ $(((${IP//./"+256*("}))))&255))
बजाय, खोल दूसरे और तीसरे का इलाज होगा )
समापन के रूप में वहाँ रों ))
के लिए $((
और एक सिंटैक्स त्रुटि रिपोर्ट।
Ksh93 में, आप यह भी कर सकते हैं:
$ echo "${IP/@(*).@(*).@(*).@(*)/\2}"
96
bash
, ksh93 के ऑपरेटर को कॉपी किया है mksh
, लेकिन उस कैप्चर-ग्रुप हैंडलिंग पार्ट को नहीं। एक अलग सिंटैक्स के साथ इसका समर्थन करता है:zsh
${var/pattern/replacement}
zsh
$ setopt extendedglob # for (#b)
$ echo ${IP/(#b)(*).(*).(*).(*)/$match[2]}'
96
bash
अपने regexp मिलान ऑपरेटर में कैप्चर ग्रुप हैंडलिंग के कुछ प्रकार का समर्थन करता है , लेकिन अंदर नहीं ${var/pattern/replacement}
।
POSIXly, आप उपयोग करेंगे:
(IFS=.; set -o noglob; set -- $IP; printf '%s\n' "$2")
noglob
के मूल्यों के लिए बुरा आश्चर्य से बचने के लिए $IP
की तरह 10.*.*.*
subshell, विकल्प और करने के लिए उन परिवर्तनों का दायरा सीमित करने के लिए $IFS
।
Inte एक आईपीवी 4 पता सिर्फ 32 बिट पूर्णांक है और उदाहरण के लिए 127.0.0.1 कई (हालांकि सबसे आम) पाठीय अभ्यावेदन में से एक है। लूपबैक इंटरफ़ेस का वही विशिष्ट IPv4 पता 0x7f000001 या 127.1 के रूप में भी प्रस्तुत किया जा सकता है (शायद यह कहने के लिए कि यह 1
127.0 / 8 वर्ग A नेटवर्क पर पता लगाने के लिए अधिक उपयुक्त है ), या 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"