Considere o seguinte:
$ ksh -c '1(){ echo hi;};1'
ksh: 1: invalid function name
$ dash -c '1(){ echo hi;};1'
dash: 1: Syntax error: Bad function name
$ bash -c '1(){ echo hi;};1'
bash: `1': not a valid identifier
bash: 1: command not found
$ mksh -c '1(){ echo hi;};1'
hi
Basicamente, eu estava tentando declarar funções 1
e 0
quais seriam atalhos para true
e false
, mas como você pode ver, tive um problema ao usar nomes numéricos em funções. O mesmo comportamento ocorre com aliases e nomes de dois dígitos.
A pergunta é "por que"? É mandatado pelo POSIX? ou apenas uma peculiaridade de conchas tipo bourne?
Veja também a pergunta relacionada a este.
command-line
bash
dash-shell
ksh
Sergiy Kolodyazhnyy
fonte
fonte
0
estátrue
no script de shell e1
éfalse
(realmente, qualquer diferente de zero é tratado como falso), caso alguém que esteja lendo isso não saiba. Isso é inverso da maioria das outras linguagens de programação.true
no shell. No entanto, na expansão aritmética, os$((...))
status de retorno são invertidos - 1 étrue
e 0 éfalse
consistente com a sintaxe da linguagem C. Tente, por exemplo, obash -c 'echo $((1==1));echo $((1==2))'
que eu estava tentando fazer fora desta questão era, na verdade, "reverter" o comportamento. Veja o último exemplo da minha resposta aqui para ver o que exatamente eu estava tentando fazer. Parva ideia, mas mesmo assim funcionaRespostas:
O POSIX diz:
E:
Portanto, uma palavra que começa com um dígito não pode ser um nome de função.
fonte
1L
significaria? Um nome de função? Ou umlong int
literal?()
, possivelmente com argumentos internos, o que indica uma chamada para a função em questão (e assume o valor retornado pela função que está sendo chamada). Portanto, se você tem uma funçãoint f() { return 42; }
em C,f
é válida em um contexto de ponteiro ef()
é válida em um contexto inteiro sem ponteiro.Esse é um padrão em muitas línguas para evitar confusão entre operações matemáticas e variáveis ou funções ou métodos.
Considerar:
Como você pode ver, se os números fossem permitidos como nomes de variáveis ou funções, fazer matemática posteriormente em um programa pode se tornar muito confuso e você teria que criar soluções alternativas criativas se realmente precisasse fazer matemática com esses números mais tarde. Também pode produzir resultados inesperados em alguns idiomas. Imagine que você está incrementando um número para um loop, mas um dos dígitos já é uma variável igual a uma string. Isso geraria imediatamente um erro. Se você não era o autor original do código, esse erro poderia demorar um pouco para ser encontrado.
Em poucas palavras, é por isso que a maioria dos idiomas não permite que você use um número como o nome de uma variável, função, método ou etc.
fonte
$
para serem expandidas", mas se o shell for inspirado em outras linguagens, tudo bem, eu acho, além disso, nas((
variáveis de expansão aritmética não é necessário ter liderança$
. OK, eu posso entender isso #$
, então é isso. Mas isso é provavelmente secundário para o outro motivo de "apenas seguinte convenção comum"0
para o nome do shell ou script,1
,2
, ..., para parâmetros de posição,*
para eles se juntaram,-
para opções ativadas,?
para o último status de saída, e!
para o PID do trabalho assíncrono mais recente. (Assim, mesmo em$((
))
,$
geralmente é necessário.) O código mostrado aqui para demonstrar a lógica sugerida não é um script para qualquer shell no estilo Bourne, pois não há como demonstrar dessa maneira, pois não se aplica a eles.Em C, considere uma expressão como:
É
1000l
uma variável ou uma constante? Como os nomes das variáveis não podem começar com um dígito, deve ser uma constante. Isso torna a análise mais fácil e mais rigorosa (erros de digitação1000k
podem ser facilmente capturados). Também é mais fácil ter uma regra única para variáveis e nomes de funções, pois as funções também podem ser tratadas como variáveis. Agora , é claro, os analisadores são muito mais complexos e poderosos, e temos coisas como literais personalizados em C ++. Mas naqueles dias antigos da pré-história, sacrificar um pouco de flexibilidade desnecessária poderia tornar seus tempos de compilação (ou interpretação) muito mais curtos (e as pessoas ainda reclamam dos tempos de compilação em C ++).E você pode ver os efeitos de uma influência C em toda a linguagem do shell, portanto, não é surpreendente que o shell Bourne (ou shell C) e, portanto, POSIX, tenha restringido a classe de nomes permitidos à mesma do C.
fonte
&&
e -vírgula, curto-circuito e||
falta de suporte para o nulo ASCII em strings,