Como podemos armazenar a saída de um comando como uma matriz no script de shell Unix?

0

Eu quero armazenar a saída de um comando em uma matriz. Eu tentei com o comando abaixo que recebi de uma pergunta semelhante feita aqui. Por favor, encontrar abaixo os comams de concha que eu usei:

#!/bin/ksh

mailx -H >mytest.txt
#awk '/Incident/{ print NR;}' mytest.txt >lineNum.txt
msgNumbers=$(awk '/Incident/{ print NR;}' mytest.txt)
echo $msgNumbers

Eu posso obter o resultado necessário executando diretamente este comando no UNIX. Mas quando estou usando o mesmo comando em um script de shell, estou recebendo um erro:

"syntax error at line 5: 'msgNumbers=$' unexpected"

Alguém poderia apontar o erro?

    
por Devjith 21.08.2018 / 12:36

2 respostas

0

Esse é o erro que você teria se estivesse interpretando esse script com o shell Bourne, um shell muito antigo dos anos 70, pouco usado atualmente, exceto talvez no Solaris 10 ou mais.

Então, minha aposta seria que esse script está sendo interpretado por /bin/sh no Solaris 10 ou anterior, não em ksh . No Solaris, o padrão sh está em /usr/xpg4/bin/sh .

O shell Bourne não suportava a forma $(...) de substituição de comando, você tinha que usar '...' .

Em qualquer caso, nem a shell Bourne nem a especificação POSIX sh suportam matrizes. Para atribuir uma variável de matriz ao conteúdo das linhas não vazias da saída de um comando com /bin/ksh do Solaris 10 (que é baseado em ksh88), você precisaria:

set -o noglob
IFS='
'
set -A array -- $(cmd)

(note que os arrays do ksh88 não podem ter mais de 4096 elementos).

E então você exibe os elementos da matriz como:

((${#array[@]})) && printf '"%s"\n' "${array[@]}"

Se o seu script tiver #!/bin/ksh she-bang, ele deverá ser invocado como /path/to/the/script ou ksh /path/to/the/script , não sh /path/to/the/script .

    
por 21.08.2018 / 14:17
0

Para atribuir as palavras separadas que um comando produz a um array em ksh , você pode fazer

array=( $( mycommand ) )

Isso executaria mycommand (esse comando awk no seu caso), e a saída desse comando seria dividida em palavras em espaços em branco (espaços, tabulações e novas linhas por padrão, que é o conteúdo do IFS da variável shell). O shell também executaria a geração de nome de arquivo ("globbing") em cada palavra, a menos que set -f estivesse em vigor.

Para produzir esses elementos, você usaria

printf 'Element: %s\n' "${array[@]}"

ou

printf 'Elements: %s\n' "${array[*]}"

, dependendo se você deseja produzir cada elemento individualmente (a primeira opção) ou juntos, separados pelo primeiro caractere em IFS (a segunda opção). Fazer echo $array só produziria o primeiro elemento da matriz (e, mais uma vez, como não é citada, divide-a em espaços em branco e executa a geração de nome de arquivo).

Ou, você poderia apenas executar o comando awk sem tentar armazenar a saída em qualquer lugar (já que isso obviamente também produziria o resultado). Isso depende do que você deseja fazer com o resultado do comando awk .

    
por 21.08.2018 / 14:18

Tags