Existem shells que suportam variáveis tipadas e arrays multidimensionais?

4

Existe um shell que suporta a distinção entre tipos de variáveis e matrizes multidimensionais?

No mínimo, deve distinguir entre Strings, Integers, Floats e Doubles.

Os seguintes comandos devem ser diferentes. command 1 e command "1" se os tipos de variáveis forem suportados. Observe que seria semelhante a uma função c como fun(1) e fun("1") . Como alternativa, ele deve ter duas sintaxes separadas para as funções shell e call.

    
por William 17.10.2015 / 04:23

2 respostas

4

Perl Shell suporta três tipos de variáveis: escalares, listas e hashes.

Perl Shell (psh) combines aspects of bash and other shells with the power of Perl scripting.

e

The Perl Shell is a shell that combines the interactive nature of a Unix shell with the power of Perl. The goal is to eventually have a full featured shell that behaves as expected for normal shell activity. But, the Perl Shell will use Perl syntax and functionality for control- flow statements and other things.

Ele não diferencia muito entre Strings, Integers, Floats e Doubles [1] , como converter perfeitamente entre eles conforme necessário, exatamente como o Perl faz.

É difícil ver qualquer razão pela qual um shell precisaria distinguir entre um número 1 e a string "1" em qualquer situação em que o autorregionamento fosse o Coisa Errada a Ser ou onde diferentes operadores para string versus numérico A comparação vs regexp não foi suficiente. Muito parecido com bash ou outras shells.

[1] Veja os módulos especializados, como Matemática :: BigFloat se for necessário um tratamento especial de tipos flutuantes. ou Math :: Bigint para números inteiros muito grandes.

    
por 17.10.2015 / 05:41
3

Há uma tensão entre ter uma boa distinção entre tipos e permitir digitação rápida. Os shells são strongmente orientados para digitação rápida: seu objetivo é permitir que você faça coisas únicas com facilidade, no menor número de caracteres possível. Ter que adicionar aspas porque você quer que 1 seja uma string (para passar para um programa) em vez de um número seria um fardo.

Ksh, bash e zsh possuem variáveis digitadas. No entanto, essas variáveis são apenas cadeias com validação extra. Se você tentar definir uma variável inteira com um valor que não seja uma expressão aritmética, receberá um erro ou, às vezes, o valor 0 (e, em particular, qualquer identificador válido será substituído por 0, se não for uma variável definida , a menos que set -u esteja em vigor).

$ integer n
$ n=3
$ echo $n
3
$ n=2+2
$ echo $n
4
$ n=undefined+1
$ echo $n
1
$ n='_!@()#(*#'
mksh: _!@()#(*#: unexpected '!'

O Ksh93 vai além e permite que você defina tipos personalizados (com typeset -T ), com funções para obter e definir valores de variáveis (chamados de funções de disciplina) que permitem rejeitar valores inválidos. Há um auxiliar predefinido enum para definir um tipo com um número finito de valores permitidos.

$ enum day=(Sunday Monday Tuesday Wednesday Thursday Friday)
$ day d=Monday
$ echo $d
Monday
$ d=monday
ksh93: d:  invalid value monday

Todos os valores podem ser transparentemente usados como strings. Se você não quer isso, você reduz automaticamente o valor da linguagem como um shell, porque no final a finalidade principal de um shell é executar outros programas, e os argumentos de linha de comando de um programa são strings. No entanto, existem ambientes interativos nos quais o lançamento de outros programas não é considerado a tarefa principal, que não possui conversão automática para cadeias de caracteres. Eu listo alguns em shell orientado a objetos para * nix

    
por 18.10.2015 / 00:57