Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何获取字符串的数字部分并将其存储在varable-in-shell中?_Bash - Fatal编程技术网

Bash 如何获取字符串的数字部分并将其存储在varable-in-shell中?

Bash 如何获取字符串的数字部分并将其存储在varable-in-shell中?,bash,Bash,我无法将十进制值存储到变量time中,它会引发如下错误: ping.sh:第2行:1.79:未找到命令 下面是正确的一行: ttl=251 time=1.79 ttl=251 time=1.38 time=$(echo $line | cut -d' ' -f2) time= $(echo $time | cut -d'=' -f2) 存在不需要的空间,请使用外壳检查进行故障排除,请参阅以下内容: time=$(echo $time | cut -d'=' -f2) 新的脚本将

我无法将十进制值存储到变量time中,它会引发如下错误:

ping.sh:第2行:1.79:未找到命令


下面是正确的一行:

ttl=251 time=1.79 
ttl=251 time=1.38 

time=$(echo  $line | cut -d' ' -f2)
time= $(echo  $time | cut -d'=' -f2)
存在不需要的空间,请使用
外壳检查
进行故障排除,请参阅以下内容:

time=$(echo  $time | cut -d'=' -f2)

新的脚本将是:

In /tmp/test.sh line 2:
time= $(echo  $time | cut -d'=' -f2))
    ^-- SC1007: Remove space after = if trying to assign a value (for empty string, use var='' ... ).
       ^-- SC2091: Remove surrounding $() to avoid executing output.
       ^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
如果您使用的是bash,则以下几行代码更有效:

line1="ttl=251 time=1.79"
line2="ttl=251 time=1.38"

time1=$(printf "%s" "${line1}" | cut -d' ' -f2)
time1=$(printf "%s" "${time1}" | cut -d'=' -f2)

正如我们所知,我们需要从“ttl=251 time=1.79”中获得时间值,我们可以用awk除以“=”字符:

line1="ttl=251 time=1.79"
line2="ttl=251 time=1.38"

time1="${line1##* time=}"
tr-d获取数值而不使用\n

注意:这仅用于命令行。在脚本中,您不需要“tr-d”

在ping命令中,输出如下:

line="ttl=251 time=1.79"
echo "${line}" | awk '{split($0,a,"="); print a[3]}' | tr -d '\n'
我们可以得到一份关于时间的清单:

ivo@spain-nuc-03:~/Downloads/TestStackoverflow$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=3.35 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=2.50 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=2.64 ms
请记住在awk中将位置更改为4。
希望这有帮助

我从第行得到一个字符串,它是time=1.79,我想剪切time=并将十进制值存储到变量i中write@sravs是的,您几乎完全正确,除了在最后一个命令中的
=
后面有一个额外的空白,正如回答中所指出的。删除空白后,将显示此错误剪切:分隔符必须是单个字符。有关详细信息,请尝试“剪切--help”。非常感谢,它正在工作。您能否澄清如何从脚本访问
ttl=XXX time=Y.YY
数据?我看到您引用了一个
$line
变量,该变量可能包含该数据,但我看不出它是如何初始化的。我正在逐行读取两个时间限制之间的日志文件,我需要得到列time=1.79,但我希望十进制值1.79在两个时间限制之间做平均最大时间。发布的内容应该是自我记录的,不需要在评论中进一步讨论。如果有什么东西值得发表评论来解释你的问题,那么你应该编辑你的Q,在评论中回复评论者“见上面更新的Q”。此外,一个好的Q值将为1。说明问题的最小数据集,2。同一组数据的所需输出,3。用代码解决问题的最佳尝试,4。当前输出和错误消息,5。你的想法是为什么它应该起作用但不起作用。。。。。在这里发布更多Qs之前,请阅读和。同样值得搜索您的错误消息,因为您的Q可能以前被问过(以稍微不同的形式),可以让您的项目进展更快,而不是等待答案。或者你可以改进你的Q,说“我看到了post X,我认为这个解决方案应该适合我,但它没有(或类似)。此外,你可以通过剪切/粘贴你的代码(确保包含
#!/bin/bash
或你选择的shell作为第一行输入)来获得更快的解决方案。祝你好运。
ivo@spain-nuc-03:~/Downloads/TestStackoverflow$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=3.35 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=2.50 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=2.64 ms
ivo@spain-nuc-03:~/Downloads/TestStackoverflow$ ping 192.168.1.1 | awk '{split($0,a,"="); print a[4]}'

2.47 ms
6.20 ms
4.85 ms
2.52 ms
1.01 ms
2.58 ms