是否有支持类型变量和多维数组的 shell?

是否有支持类型变量和多维数组的 shell?

有没有支持区分变量类型和多维数组的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

相关内容