有没有支持区分变量类型和多维数组的shell?
至少,它应该区分字符串、整数、浮点数和双精度数。
以下命令应该有所不同。command 1
以及command "1"
是否支持变量类型。请注意,它类似于 ac 函数,如fun(1)
和fun("1")
。或者它应该有 2 个独立的 shell 和调用函数语法。
答案1
Perl 外壳支持三种类型的变量:标量、列表和散列。
Perl Shell (psh) 将 bash 和其他 shell 的各个方面与 Perl 脚本的强大功能相结合。
和
Perl Shell 是一个将 Unix shell 的交互特性与 Perl 的强大功能相结合的 shell。我们的目标是最终拥有一个功能齐全的 shell,其行为符合正常 shell 活动的预期。但是,Perl Shell 将使用 Perl 语法和功能来处理控制流语句和其他内容。
它并没有太多区分字符串、整数、浮点数和双精度数[1],根据需要在它们之间无缝转换,就像 Perl 所做的那样。
在自动转换是错误的情况下,或者在字符串、数字和正则表达式比较的不同运算符不足以满足要求的情况下,很难看出 shell 需要区分数字1
和字符串的任何原因。"1"
就像bash
其他 shell 一样。
[1]查看专业模块,例如数学::BigFloat如果需要对浮点类型进行特殊处理。或者数学::Bigint对于非常大的整数。
答案2
精确区分类型和允许快速输入之间存在着矛盾。 shell 非常适合快速打字:它们的目的是让您可以使用尽可能少的字符轻松完成一次性的工作。因为您想要1
成为字符串(将其传递给程序)而不是数字,所以必须添加引号将是一种负担。
Ksh、bash 和 zsh 确实有类型变量。然而,这些变量只是经过额外验证的字符串。如果您尝试将整型变量设置为不是算术表达式的值,则会收到错误,或者有时会收到值 0(特别是,如果不是已定义的变量,则任何有效标识符都会被 0 替换) ,除非set -u
有效)。
$ integer n
$ n=3
$ echo $n
3
$ n=2+2
$ echo $n
4
$ n=undefined+1
$ echo $n
1
$ n='_!@()#(*#'
mksh: _!@()#(*#: unexpected '!'
Ksh93 更进一步,允许您定义自定义类型(使用typeset -T
),并使用获取和设置变量值的函数(称为规则函数)来拒绝无效值。有一个预定义的帮助器enum
来定义具有有限数量的允许值的类型。
$ enum day=(Sunday Monday Tuesday Wednesday Thursday Friday)
$ day d=Monday
$ echo $d
Monday
$ d=monday
ksh93: d: invalid value monday
不过,所有值都可以透明地用作字符串。如果你不想这样,你就会自动降低该语言作为 shell 的价值,因为最终 shell 的主要目的是运行其他程序,而程序的命令行参数是字符串。但是,在某些交互式环境中,启动其他程序不被视为主要任务,并且不会自动转换为字符串。我列出了一些*nix 的面向对象 shell