我想将字符串转换为数字,以便在 SCP 命令中使用。有人可以帮忙吗?
set ip "192.168.1.2"
scp:root@$ip//etc/dev/
它不会用我设置的IP替换$ip
。
如何将IP转换为数字,因为scp命令需要数字而不是字符串。
由于
答案 0 :(得分:1)
你需要一个库来做到这一点。 tcllib有IP address manipulation module:
package require ip
set ip "192.168.1.2"
set num [ip::toInteger $ip]
puts $num
puts [ip::intToString $num]
-1062731518
192.168.1.2
这看起来很奇怪:scp:root@$ip//etc/dev/
回想一下,Tcl评估command word ...
之类的命令,并且“scp”命令中没有空格,因此Tcl将尝试查找名为“scp:root@192.168.1.2//etc/dev/”的命令 - 我打赌它找不到一个。
答案 1 :(得分:1)
这不是将任何字符串转换为数字,而是转换为IP地址。在Tcl 大多数中,所有内容都是字符串,因此您只需使用expr命令进行数学运算,它将根据需要进行转换。请注意我在expr
中的实现中如何简单地引用[lindex $octets $i]
这是一个从拆分IP地址派生的字符串,但命令仍按预期运行。
以下是您真正要求的天真实现:将IP地址转换为数字(整数);你想要通过各种验证(段数组的长度,每个段的最小/最大等)来增强它 - 这就是为什么在另一个答案中建议的库可能是更好的方法,更不用说可能是配备处理ipv6,我只是忽略;)
Here's an explanation of the implementation in general;请任何人随意编辑一个更好的。关于我的实现的一个注释:通过反转列表,我将上一个八位字节乘以256 ^ 0,最后一个八位字节乘以256 ^ 1等等,将权力乘以lindex。
set ip "192.168.1.2"
set ip_as_int 0
set octets [lreverse [split $ip .]]
for {set i 0} {$i < 4} {incr i} {
set ip_as_int [expr {256 ** $i * [lindex $octets $i] + $ip_as_int}]
}
puts $ip_as_int ;#3232235778