任何 shell 是否都可以将带小数点的字符串解释为数字(int、float)?

任何 shell 是否都可以将带小数点的字符串解释为数字(int、float)?

这个想法是我在最近更新 Visual Studio Code 时想到的,在更新中我通常也会自动对我的代码进行 shellcheck。这就是我,所以你可以得到这个想法:

在此输入图像描述

对于那些可以在许多 shell 中测试的人来说,这个问题确实非常简单,我只安装了 Bash 和 Dash:

任何 shell 是否都可以将带小数点的字符串解释为数字(int、float)?

感谢您的时间。

答案1

var=value

如果我们只看主要的 Unix shell 系列,会发现类 Bourne shell 中的标量变量赋值、类 rc shell 中的变量赋值(所有变量都是列表,这里是一个只有一个值的列表)、fish 中的错误并运行var=value类似于 csh 的 shell 中的命令(更多信息请参见shell 脚本中变量赋值中的空格)。

在那些赋值的情况下,为了尝试将该变量的值视为数字,您需要$var(或var有时在类似 Korn 的 shell 中)在需要数字或算术表达式的上下文中使用。

如(并非全部适用于所有 shell)

arr[var]=foo
printf '%g\n' "$var"
printf '%d\n' var
(( var++ ))
echo "$(( var ))"
[[ var -gt 2 ]]
shift var
echo "$var + 1" | bc
export var; awk '{print ENVIRON["var"] + 1}'

在类似 Korn 的 shell 中,包括kshbashzsh,如果变量已用typeset -i var、 或相同的-E-For -X、 or integer varor声明float var(bash/pdksh 中没有浮点型变量),则在赋值时将其解释为数字。

192.168.0.40但在任何基数或语言环境中都不是有效的整数或浮点数。192.168在许多上下文中是有效的浮点数,并且在千位分隔符为 的语言环境中可能是有效的整数.

192.168.123.123192168123123(每组总是 3 位数字,除了第一个数字)与千位分隔符所在的区域设置相同,.因此可以在需要数字且接受区域设置千位分隔符的上下文中接受。

我只知道 ksh93 的算术表达式是这种情况。例如:

$ LC_ALL=it_IT.UTF-8 var=192.168.123.123 ksh93 -c 'printf "%e\n" var'
1,921681e+11
$ LC_ALL=it_IT.UTF-8 ksh93 -c 'echo "$((192.168.123.123 * 2))"'
384336246246
$ LC_ALL=it_IT.UTF-8 ksh -c 'integer var; var=192.168.123.123; echo "$var"'
192168123123

在意大利语言环境中,逗号是小数基数字符,句点是千位分隔符。

但无论如何,只要您不明确要求将变量的内容解释为数字,就像上述所有情况一样,它就不会被解释为数字,该编辑器的语法荧光笔只是具有误导性, shell 主要是一个运行命令的工具,命令是字符串参数列表,因此默认情况下 shell 变量通常只包含字符串或字符串列表,并且由 shell 执行的命令将这些字符串解释为数字、文件名、用户名、IP 地址或任何他们喜欢的内容。


1 对于通过系统调用执行的序列,除了 0 之外,还有 0 个或更多字节的序列,execve()因为它的第二个argv[]参数是指向 C(NUL 分隔)字符串的指针数组。

答案2

我只安装了 Bash 和 Dash。

根据给定的上下文,无法确定这些变量是否指定了类型,但是:

bash-5.2$ declare -i n
bash-5.2$ n=192.168.0.40
bash: 192.168.0.40: syntax error: invalid arithmetic operator (error token is ".168.0.40")

相关内容