Vlastimil Burián Asked: 2023-06-27 02:31:31 +0800 CST2023-06-27 02:31:31 +0800 CST 2023-06-27 02:31:31 +0800 CST 任何 shell 是否都可以将带小数点的字符串解释为数字(int、float)? 772 这个想法是我在最近更新 Visual Studio Code 时想到的,在更新中我通常也会自动对我的代码进行 shellcheck。这是我所看到的,所以你可以明白: 对于那些可以在许多 shell 中测试的人来说,这个问题确实非常简单,我只安装了 Bash 和 Dash: 任何 shell 是否都可以将带小数点的字符串解释为数字(int、float)? 感谢您的时间。 不要告诉我请不要发布有关此特定问题的文字图片。否则你不会看到是什么让我发帖,只用文字。目前的内容是无关紧要的,所以我在这个问题上不同意它(文本图像)。干杯。 shell 2 个回答 Voted Best Answer Stéphane Chazelas 2023-06-27T13:23:23+08:002023-06-27T13:23:23+08:00 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 中,包括ksh、bash和zsh,如果变量已用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 分隔)字符串的指针数组。 muru 2023-06-27T11:32:14+08:002023-06-27T11:32:14+08:00 我只安装了 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")
如果我们只看主要的 Unix shell 系列,会发现类 Bourne shell 中的标量变量赋值、类 rc shell 中的变量赋值(所有变量都是列表,这里是一个只有一个值的列表)、fish 中的错误并运行
var=value
类似 csh 的 shell 中的命令(更多信息请参见shell 脚本中变量赋值中的空格)。在那些赋值的情况下,为了尝试将该变量的值视为数字,您需要
$var
(或者var
有时在类似 Korn 的 shell 中)在需要数字或算术表达式的上下文中使用。如(并非全部适用于所有 shell)
在类似 Korn 的 shell 中,包括
ksh
、bash
和zsh
,如果变量已用typeset -i var
、 或相同的-E
、-F
or-X
、 orinteger var
or声明float var
(bash/pdksh 中没有浮点型变量),则在赋值时将其解释为数字。192.168.0.40
但在任何基数或语言环境中都不是有效的整数或浮点数。192.168
在许多上下文中是有效的浮点数,并且在千位分隔符为 的语言环境中可能是有效的整数.
。192.168.123.123
192168123123
(每组总是 3 位数字,除了第一个数字)与千位分隔符所在的区域设置相同,.
因此可以在需要数字且接受区域设置千位分隔符的上下文中接受。我只知道 ksh93 的算术表达式是这种情况。例如:
在意大利语言环境中,逗号是小数基数字符,句点是千位分隔符。
但无论如何,只要您不明确要求将变量的内容解释为数字,就像上述所有情况一样,它就不会被解释为数字,该编辑器的语法荧光笔只是具有误导性, shell 主要是一个运行命令的工具,命令是字符串参数列表,因此默认情况下 shell 变量通常只包含字符串或字符串列表,并且由 shell 执行的命令将这些字符串解释为数字、文件名、用户名、IP 地址或任何他们喜欢的内容。
1 通过系统调用执行的 0 或更多字节序列(除 0 之外),因为
execve()
它的第二个argv[]
参数是指向 C(NUL 分隔)字符串的指针数组。根据给定的上下文,无法确定这些变量是否指定了类型,但是: