sh -c não obtém a saída correta ao executar o shell script

2

Faço um loop para obter dados do array no shell,
Funciona quando eu o executo em um arquivo shell, com este conteúdo:

arr=(1 2 3 4 5)  
for var in ${arr[@]};  
do  
    echo $var  
done

Mas não há saída quando uso sh -c como abaixo:

sh -c "arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done"
    
por paladin 10.09.2015 / 12:27

2 respostas

6

O seu problema é usar sh -c "..." , consulte @s respostas de Gilles para obter mais detalhes.

Mais ainda, sh (consulte POSIX sh ) não suporta array ( estritamente falando, ele tem apenas um array, $ @ ), você precisa ligar para outros shells no seu sistema, que suportam array como bash , zsh ou ksh .

bash -c 'arr=(1 2 3 4 5);for var in "${arr[@]}";do echo "$var"; done'

Observe também que você cometeu um erro ao deixar ${arr[@]} un-quote, na verdade você precisa de for var in "${arr[@]}" . Invocação de variável sem aspas chamando split + glob e é fonte de muitas implicações de segurança .

Para jogar com POSIX sh, você pode usar $ @ :

set -- 1 2 3 4 5
for var do
  printf '%s\n' "$var"
done
    
por 10.09.2015 / 12:46
2

O problema é que você usou o tipo errado de aspas. Shells interpolam variáveis dentro de aspas duplas, portanto, as referências de variáveis foram interpoladas pelo shell no qual você executou sh -c "…" . Supondo que este shell não tivesse variáveis nomeadas arr ou var defined, o argumento para sh -c era

arr=(1 2 3 4 5);for var in ;do echo ;done

Se sh é um shell que suporta arrays, este é um código perfeitamente válido, que por acaso não faz nada.

Para passar uma string literal para um comando, use aspas simples. Todos os caracteres dentro de aspas simples são interpretados literalmente, então você pode usar todos os caracteres, exceto uma simples citação na string. (Se você precisar de uma aspa simples, escape como a seqüência de quatro caracteres '\'' .)

sh -c 'arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done'

Tenha em atenção que nem todas as implementações de sh suportam matrizes. Se você precisa de arrays, você deve invocar explicitamente um shell que os suporte.

ksh -c 'arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done'

ou

bash -c 'arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done'
    
por 11.09.2015 / 04:18

Tags