重击-46
表中的内容
您会发现4种不同的高尔夫版本:
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0] # 46chr
set -- ${1//./ };echo $[$1<<24|$2<<16|$3<<8|$4] # 47chr
v=('|%d<<'{24,16,8,0});printf -vv "${v[*]}" ${1//./ };echo $[0$v] # 65chr
mapfile -td. i<<<$1;for((a=o=0;a<4;o+=i[a]<<(3-a++)*8)){ :;};echo $o # 68chr
新版本!2018-11-15更多打高尔夫球,46个字符
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0]
说明
- 我用了
$_
打高尔夫球。
- 语法
${1//./ }
将.
用空格替换每个点
。
- 所以
printf
会渲染像192<<(_-=8)|168<<(_-=8)|1<<(_-=8)|1<<(_-=8)|
- 那么我们将
0
在最后一个OR后面添加 |
和
- 预设
_
为32。庆典将读取结构由左到右,所以$((_-=8))
让24
在第一次转变,16
在第二次,依此类推。
实际上:
set -- 192.168.1.1
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0]
3232235777
为了娱乐:$_
在此之后尝试获取内容:
echo $_
3232235777
; -b
set -- 192.168.1.1
echo $_ $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0] $_
192.168.1.1 3232235777 0
好,那是正确的 32 - 4 x 8 = 0
在函数中:
ip2int() {
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0]
}
ip2int 192.168.1.1
3232235777
ip2int 255.255.255.255
4294967295
ip2int 0.0.0.0
0
或进入循环:-> 60
ip2int() {
for i;do
echo $[_=32,`printf "%d<<(_-=8)|" ${i//./ }`0]
done
}
ip2int 192.168.1.1 10.10.104.36 8.8.8.8 1.1.1.1 255.255.255.255 0.0.0.0
3232235777
168454180
134744072
16843009
4294967295
0
bash(v4.1 +):47
第一篇文章
set -- ${1//./ };echo $[$1<<24|$2<<16|$3<<8|$4]
说明:
- 语法
${1//./ }
将.
用空格替换每个点
。
set --
设置位置参数($@=($1 $2 $3...)
)
- 因此,
set -- ${1//./ }
将分为$1
由点及集$1
,$2
,$3
和$4
如果字符串方含3
点(无空格)。
实际上:
set -- 192.168.1.1
set -- ${1//./ };echo $[$1<<24|$2<<16|$3<<8|$4]
3232235777
或功能中:
ip2int() {
set -- ${1//./ }
echo $[$1<<24|$2<<16|$3<<8|$4]
}
ip2int 192.168.1.1
3232235777
ip2int 0.0.0.0
0
或进入循环:-> 61
for i;do set -- ${i//./ };echo $[$1<<24|$2<<16|$3<<8|$4];done
实际上:
ip2int() {
for i;do
set -- ${i//./ }
echo $[$1<<24|$2<<16|$3<<8|$4]
done
}
ip2int 192.168.1.1 10.10.104.36 8.8.8.8 1.1.1.1 0.0.0.0
3232235777
168454180
134744072
16843009
0
打高尔夫球的另一个版本:65
v=('|%d<<'{24,16,8,0});printf -vv "${v[*]}" ${1//./ };echo $[0$v]
样品:
ip2int() {
v=('|%d<<'{24,16,8,0});printf -vv "${v[*]}" ${1//./ };echo $[0$v]
}
ip2int 255.255.255.255
4294967295
ip2int 10.10.104.36
168454180
循环播放(+14):82
ip2int() {
for i;do
v=('|%d<<'{24,16,8,0})
printf -vv "${v[*]}" ${1//./ }
echo $[0$v]
done
}
*或更难看:70 *
v=('|%d<<'{24,16,8});printf -vv "${v[*]}" ${1//./ };echo $[0${v%<<2*}]
这里printf
给出一些字符串如|192<<24 |168<<16 |1<<8|1<<24 |0<<16 |0<<8
我们在去年削减<<2...
。
打高尔夫球mapfile
,更长:68
ip2int() {
mapfile -td. i<<<$1;for((a=o=0;a<4;o+=i[a]<<(3-a++)*8)){ :;};echo $o
}
或带循环:82
ip2int() {
for a;do
mapfile -td. i<<<$a;for((a=o=0;a<4;o+=i[a]<<(3-a++)*8)){ :;};echo $o
done
}