Resultado da condição inesperada em um script ksh

3

Eu sou novo em scripts de shell. O código abaixo não está funcionando. Alguém pode me ajudar nisso?

Eu dei uma explicação para todas as linhas:

#!/bin/ksh
cat example.txt | while read LINE                 # reading line from file
do
    var=$LINE                                     # assigning line to variable
    echo $var                                     # printing the line
    H_OR_T="${var:0:6}"                           # taking substring from the line 
    echo $H_OR_T                                  # printing the substring

até aqui, o código está funcionando bem.

Se a variável H_OR_T mantiver o valor codificado (isto é, M $ 9001, por favor, verifique se a condição abaixo) eu devo inserir o loop. Mas aqui estou recebendo erros aritméticos. Eu tentei todas as maneiras possíveis ainda, e estou enfrentando o mesmo problema.

    if [[ $H_OR_T = "M$9001" ] || [ $H_OR_T = "M$9002" ]]; 
       then
       echo "************** MOVING HEADER OR TRAILER RECORD TO DOMESTIC FILE ************"
       awk '{print $0}' example.txt > domestic.txt
    else
       echo "**************** MOVING RECORD TO LOGGER FILE **********************"
       awk '{print $0}' example.txt > logger.txt
    fi
done
    
por giri 21.08.2013 / 00:19

3 respostas

5

Não é um especialista em ksh, mas acho que você tem dois problemas em seu código.

Primeiro problema: você precisa colocar aspas simples M$9001 , caso contrário, o shell tentará expandir $9001 .

Segundo problema: você não aninha o [ ] dentro de [ ] . Use [[ ]] ou dois [ ] .

Você também deve citar $H_OR_T apenas no caso de se expandir para algo engraçado.

Aqui está o seu código provavelmente corrigido:

if [[ "$H_OR_T" = 'M$9001' || "$H_OR_T" = 'M$9002' ]];

Ou para ser compatível com POSIX e mais portátil:

if [ "$H_OR_T" = 'M$9001' ] || [ "$H_OR_T" = 'M$9002' ];

Observe que existem diferenças sutis entre [ ] e [[ ]] . A documentação do ksh é um pouco escassa neste tópico. Este é o melhor que eu encontrei: link questão número 10.

Q10. What is the difference between [...] and [[...]]?

A10. The [[...]] is processed as part of the shell grammar whereas [...] is processed like any other command. Operators and operands are detected when the command is read, not after expansions are performed. The shell does not do word splitting or pathname generation inside [[...]]. This allows patterns to be specified for string matching purposes.

    
por 20.08.2013 / 14:09
3

Use aspas simples por M $ 9001 se você estiver comparando com um valor exato.

if [[ "$H_OR_T" = 'M$9001' ]]; then
  ...
fi
    
por 20.08.2013 / 13:38
0

Existem mais problemas com este script. O uso inútil de cat é um dos exemplos. Se pegarmos a primeira parte do script, poderíamos ter escrito como

while read -r line; do echo "$line"; done < example.txt

Pegando a parte if.. else , qual é o uso de awk {print $0}'

if [[ "$H_OR_T" == 'M$9001' ]]; then
 ....
 ....
fi

Neste caso, "M $ 9001" é considerado literalmente.

    
por 20.08.2013 / 14:12

Tags