Não é possível atribuir o resultado da função a uma variável

0

Siga por

link e Como eu atribuo a saída de um comando para uma variável?

eu escrevi

function getos(){
    # http://stackoverflow.com/a/27776822/1637673
    case "$(uname -s)" in
       Darwin)
         OS='mac'
         ;;
       Linux)
         OS='linux'
         ;;
       CYGWIN*|MINGW32*|MSYS*)
         OS='win'
         ;;
       # Add here more strings to compare
       # See correspondence table at the bottom of this answer
       *)
         OS='other'
         ;;
    esac
    echo $OS
}


echo $(getos)

OS=${getos}
echo ${OS} # show nothing
echo $OS   # show nothing
echo $(OS) # line 36

Mas bash common.sh obteve

linux


common.sh: line 36: OS: command not found

Qual é o problema?

    
por Mithril 12.01.2018 / 15:44

2 respostas

2

bash tenta executar o comando OS e falha porque

$(OS)

é Substituição de Comando , enquanto

${OS} # or
$OS

é Expansão de Parâmetros .

A maneira correta de imprimir o conteúdo da variável OS é echo $OS .

Suponho que, no entanto, você deseje executar sua função, que atribua um valor à sua variável OS e, em seguida, imprima seu conteúdo, se não for feito pela função já:

getos
echo $OS
    
por dessert 12.01.2018 / 15:57
3

O problema subjacente é que OS=${getos} espera que getos seja uma variável , não uma função (é uma expansão de parâmetro em vez de uma substituição de comando) - eles são efetivamente diferentes namespaces:

$ function foo() { echo foo; }
$ foo
foo
$ echo ${foo}

$

(isto é, variável foo está vazia); Considerando que

$ foo=bar
$
$ foo
foo
$ echo ${foo}
bar

Se você quiser que OS seja um sinônimo para getos , você pode usar um alias :

alias OS='getos'

(embora, se você estiver usando isso em um script, esteja ciente de que a expansão de alias só é ativada por padrão em shells interativos).

TL; DR: parênteses e chaves NÃO são intercambiáveis

    
por steeldriver 12.01.2018 / 16:16