gpt4 book ai didi

shell - 运行带有算术运算的脚本时获取 "numeric argument required"

转载 作者:行者123 更新时间:2023-12-04 10:23:03 26 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数应该将格式为 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 points out在注释中,对 undefined variable 的处理有很大不同:
$ unset a
$ echo $((1 + $a))
bash: 1 + : syntax error: operand expected (error token is "+ ")
$ echo $((1 + a))
1
总之:
  • 如果您希望 undefined variable 默认为零,则省略 $ .
  • 如果你想要一个 undefined variable 被替换为空,可能会导致一个无效的表达式,那么包括 $ .

  • 在shell函数中 mili , 一个 undefined variable hr , min等,将指示代码错误,我们可能需要一条错误消息来警告我们,我们希望包含 $ .在默认值为零是合理的其他情况下,我们不会并省略 $会是正确的。

    关于shell - 运行带有算术运算的脚本时获取 "numeric argument required",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45765276/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com