para atribuição de variável de loop com espaços em branco

0

Im coletando os nomes da LPAR e atribuindo a uma variável no AIX, Em seguida, usando vários comandos para processamento.

Nomes da LPAR no sistema são: ABCD56777 TSM Mobile CD CPT 2

for lparname in 'lssyscfg -r lpar -m $system -F name,lpar_env |cut -f 1 -d, | sort';

Mas a variável loop acima não seleciona o valor completo da LPAR após o espaço. (O nome exato da LPAR é: ABCD56777 TSM Mobile CD CPT 2)

Atribui o valor de LPAR como ABCD56777 sozinho.

Você poderia me aconselhar sobre como atribuir variáveis a espaços? Infelizmente o awk não está instalado e somente o sed funcionará.

    
por satsensort 02.05.2018 / 09:34

2 respostas

1

O problema é que sua substituição de comando se expande para uma string delimitada por espaços em branco e o loop itera todas as palavras nessa string. Uma "palavra" é qualquer coisa delimitada por um espaço, tabulação ou caractere de nova linha.

Note também que em shells parecidas com Bourne que não sejam zsh , essas palavras estão sujeitas à geração de nome de arquivo (também globbing), então caracteres curinga (e { em alguns shells) também seriam um problema. espaço e tabulação.

lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort |
while IFS= read -r lpar; do
     echo "$lpar"
done

Isso usa um loop while em vez de um loop for estático. O corpo do loop while é executado em um subshell (em bash ), portanto, a variável lpar não existirá após o final do corpo do loop. Isso não é um problema se você usar a variável no corpo do loop.

Relacionados: Compreendendo "IFS = read -r line"

Outra solução seria definir IFS para uma nova linha antes do loop (e redefini-la posteriormente):

oldIFS=$IFS
IFS=$'\n'    # assumes bash
set -o noglob

for lpar in $( lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort )
do
    echo "$lpar"
done

set +o noglob
IFS=$oldIFS

O valor padrão de $IFS inclui espaços, e é por isso que o loop original percorre as coisas erradas. Também desativei o globbing de nomes para o loop, pois de outra forma poderíamos obter resultados inesperados se o texto retornado de lssyscfg incluir padrões de globbing de nomes de arquivo, conforme discutido acima.

Esta última variação é IMHO bastante deselegante e absolutamente inadequado para comandos que produzem mais do que um punhado de linhas de saída.

    
por 02.05.2018 / 10:34
-1

Eu tentaria

for lpar in $(lssyscfg -r lpar -m $system -F name,lpar_env |awk -F, '{printf "\"%s\"",$1}' | sort) 
do
   echo "$lpar"
done
  • use $( ) como substituição de comando
  • {printf "\"%s\"",$1} citará o argumento
por 02.05.2018 / 10:06