加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

shell – 使用算术运算运行脚本时获取“需要数字参数”

发布时间:2020-12-15 22:11:17 所属栏目:安全 来源:网络整理
导读:我正在尝试编写一个函数,该函数应该将形式为hr:min:sec,ms(即15:41:47,757)的时间戳转换为毫秒.功能如下: #!/bin/shmili () { hr=$(echo "$1" | cut -c1-2) echo "hr is: " $hr min=$(echo "$1" | cut -c4-5) echo "min is: " $min sec=$(echo "$1" | c
我正在尝试编写一个函数,该函数应该将形式为hr:min:sec,ms(即15:41:47,757)的时间戳转换为毫秒.功能如下:

#!/bin/sh
mili () {

    hr=$(echo "$1" | cut -c1-2)
    echo "hr is: " $hr
    min=$(echo "$1" | cut -c4-5)
    echo "min is: " $min
    sec=$(echo "$1" | cut -c7-8)
    echo "sec is: " $sec
    ms=$(echo "$1" | cut -c10-12)
    echo "ms is: " $ms
    total=$(($hr * 3600 + $min * 60 + $sec) * 1000 + $ms)

    return "$total"
    #echo "Result is: "$total" "
}

mili $1

但是,当我运行它时:

./mili.sh“15:41:47,757”

我收到以下输出消息:

./mili.sh: command substitution: line 15: syntax error near unexpected token 
`*'
./mili.sh: command substitution: line 15: `($hr * 3600 + $min * 60 + $sec) 
* 1000 + $ms'
./mili.sh: line 17: return: : numeric argument required

我尝试过使用和不使用单引号,双引号和反引号的expr变体,但似乎永远无法计算算术.我可以确认一个像这样的简单命令:expr 2 * 3但是当我尝试在我的脚本中使用类似的东西时它会失败.

我怎样才能简单地计算我的表达式呢?

解决方法

内部算术,*不需要转义.还有一些括号丢失了.因此,替换:

total=$(($hr * 3600 + $min * 60 + $sec) * 1000 + $ms)

附:

total=$((($hr * 3600 + $min * 60 + $sec) * 1000 + $ms))

替代

代码可以简化,无需多次调用cut:

mili() {
    IFS=':,' read hr min sec ms <<<"$1"
    echo "hr is: " $hr
    echo "min is: " $min
    echo "sec is: " $sec
    echo "ms is: " $ms
    total=$((($hr * 3600 + $min * 60 + $sec) * 1000 + $ms))
    echo "Total=$total"
    return "$total"
}

旁白:Bash算术和美元符号

在bash算术上下文中,变量前的美元符号是可选的.例如:

$a=1; echo "$((1 + a)) and $((1+ $a))"
2 and 2

虽然一些样式指南建议在算术上下文中省略$,但有一个关键的区别.正如Chepner在评论中指出的那样,对未定义变量的处理是非常不同的:

$unset a
$echo $((1 + $a))
bash: 1 + : syntax error: operand expected (error token is "+ ")
$echo $((1 + a))
1

总共:

>如果您希望未定义的变量默认为零,则省略$.
>如果您希望将未定义的变量替换为空,可能导致表达式无效,则包含$.

在shell函数mili中,未定义的变量hr,min等表示代码错误,我们可能需要一条错误消息来警告我们,我们希望包含$.在默认值为零的其他情况下,我们不会和省略$是正确的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读