Natureza dos parâmetros posicionais

2

Eu escrevi este script que meio que me confundiu um pouco ...

function func
{
the variables received are
echo $0: $1 and $2
}
echo in the main script
func ball boy

O nome do script é shell.txt Eu esperava que o resultado fosse

func : ball and boy

No entanto, tenho

./shell.txt :ball and boy

Eu li que os parâmetros posicionais são "locais" por natureza, então como surgiu esse resultado?

    
por chinmay 18.01.2014 / 06:02

2 respostas

3

No bash, algumas variáveis são reservadas, como $ 0, que fornece o nome do comando - nesta instância, é o nome do script (portanto, ./shell.txt). Outro exemplo é $$, que dará o ID do processo. Eu acredito que $ FUNCNAME deve imprimir o nome da função que está sendo usada.

Qualquer variável no formato $ 1 $ 2 $ 3 etc será qualquer parâmetro posicional que você tenha passado para ela.

Se você remover a variável $ 0 e substituí-la por $ FUNCNAME, obterá a saída que está procurando.

Aqui está um pequeno script, vamos salvá-lo como passingVariables.sh (usamos o .sh para mostrar que é um shell script - puramente superficial, mas ajuda a manter as coisas claras):

#!/bin/bash
echo "The first word is $1 and the second word is $2"

Agora, se eu o fiz assim:

./passingVariables.sh apple orange

Ele cuspiu o seguinte:

"The first word is apple and the second word is orange"
    
por 18.01.2014 / 06:29
1

O comportamento é dependente do shell.

Você declarou a função como não POSIX. A sintaxe portátil teria sido

func()
{
...

Você provavelmente usou bash para executar seu script. bash não faz diferença entre a sintaxe não padrão usada e a sintaxe padrão. Em ambos os casos, $0 referem-se ao nome do script.

Se você usou a AT & T ou a implementação em domínio público de ksh , que introduziu a sintaxe usada e trata as funções declaradas com function token de maneira diferente, teria observado o comportamento esperado:

$ cat go
function func
{
    echo $0: $1 and $2
}
func1()
{
    echo $0: $1 and $2
}
func ball boy
func1 ball boy
$ bash go
go: ball and boy
go: ball and boy
$ ksh go
func: ball and boy
go: ball and boy
    
por 19.01.2014 / 01:09