O comando funciona na linha de comando, mas não funciona em um script de shell [duplicado]

3

Estou criando um script e quando tento capturar um retorno de comando, tenho um erro de comando não encontrado, se eu usar este comando no terminal:

gcloud -q compute snapshots list --format='csv(NAME)'

Funciona bem.

O script é:

#!/bin/sh
CSV_SNAPSHOTS= $(gcloud -q compute snapshots list --format='csv(NAME)')
IFS=$'\n'

for i in $CSV_SNAPSHOTS
do
    echo "$i"
done
    
por Renan Otero 28.07.2016 / 15:56

2 respostas

9

Não deve haver nenhum espaço em branco após = (e também antes de = ) na declaração de variável.

Então, isso deve ser feito:

CSV_SNAPSHOTS=$(gcloud -q compute snapshots list --format='csv(NAME)')

Note também que você deve (quase sempre) citar variáveis e substituições de comandos, embora neste caso você não consiga salvar a substituição de comandos em uma variável.

Exemplo:

$ foo="$(echo spam)"
$ echo "$foo"
spam

$ bar= "$(echo egg)"
No command 'egg' found, did you mean:
    
por 28.07.2016 / 16:04
3

O erro é o espaço após o = , mas você também pode ignorar o armazenamento da saída em uma variável e, em vez disso, lê-la diretamente em seu loop:

IFS=$'\n'

gcloud -q compute snapshots list --format='csv(NAME)' |
while read -r i; do
    printf "%s\n" "$i"
done
    
por 28.07.2016 / 16:47