答案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 中,包括ksh
、bash
和zsh
,如果变量已用typeset -i var
、 或相同的-E
、-F
or -X
、 or integer var
or声明float var
(bash/pdksh 中没有浮点型变量),则在赋值时将其解释为数字。
192.168.0.40
但在任何基数或语言环境中都不是有效的整数或浮点数。192.168
在许多上下文中是有效的浮点数,并且在千位分隔符为 的语言环境中可能是有效的整数.
。
192.168.123.123
192168123123
(每组总是 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")