[[0 * 10% 300]] funciona no AIX 6.1, mas não no AIX 7.1 (ksh)

1

Eu tenho um script ksh93 que estou migrando do AIX 6.1 para o AIX 7.1

Ele está falhando no 7.1, mas funciona bem no 6.1. Aqui está um trecho das partes importantes.

integer f_count=0
   . . . 
   . . . 
   . . . 
if [[ ($f_count*$sleep_interval%$alarm_interval -eq 0 ) && $f_count > 0 ]]       
then

Quando atinge o "if" eu recebo

linha 191: * 10% 300: erro de sintaxe aritmética

Eu decidi simplificar digitando isso no prompt de comando.

AIX 7.1> integer x=1          
AIX 7.1> [[ $x*10%300 -eq 0 ]]
AIX 7.1> print $?
1
AIX 7.1> integer x=0          
AIX 7.1> [[ $x*10%300 -eq 0 ]]
-ksh93: *10%300: arithmetic syntax error


AIX 6.1> integer x=1          
AIX 6.1> [[ $x*10%300 -eq 0 ]] 
AIX 6.1>  print $?                                                                                        
1
AIX 6.1>  integer x=0                                                           
AIX 6.1>  [[ $x*10%300 -eq 0 ]] 
AIX 6.1>  print $?                                                                                        
0

Para mostrar o ksh93 no AIX 6.1, eu fiz isso.

asdlkfjasd
-ksh93: asdlkfjasd: not found.

Se eu mover o valor 0 para que não seja o primeiro, ele funcionará como esperado.

AIX 7.1> integer x=1            
AIX 7.1> [[ 10*$x%300 -eq 0 ]]  
AIX 7.1> print $?             
1
AIX 7.1> integer x=0           
AIX 7.1> [[ 10*$x%300 -eq 0 ]]  
AIX 7.1> print $?             
0

Isso consertará meu problema, pois eu sei que a segunda e a terceira variáveis na minha equação original nunca serão 0.

Isso está mostrando um bug do AIX 7.1?

    
por Scavenger 09.11.2016 / 14:52

3 respostas

2

Parece que você encontrou um bug no ksh93.

Eu posso reproduzi-lo (ksh93u +) com:

$ x= ksh -c '[[ 0*1 -eq 5 ]]'
ksh: *1: arithmetic syntax error

Tudo bem com:

ksh -c '[[ " 0*1" -eq 5 ]]'

embora. E parece que foi corrigido em ksh93v- (beta) porque não consigo reproduzi-lo lá.

De qualquer forma, eu usaria:

if ((f_count * sleep_interval % alarm_interval == 0 && f_count > 0)); then

Algumas notas:

  • dentro de [[...]] , > é para comparação de cadeia (em que 10 é menor que 2 e, dependendo da localidade, -1 pode ser maior que 0). Use -gt para comparação numérica (embora seja melhor usar ((...)) ).
  • evite expandir variáveis dentro de expressões aritméticas, como em, use x em vez de $x . Por exemplo, compare:

    $ x=-1 ksh -c '((-$x > 0))'
    ksh: --1 > 0: assignment requires lvalue
    

    com

    $ x=-1 ksh -c '((-x > 0))'
    $
    

    Ou:

    $ x=1+1 ksh -c 'echo "$(($x * 2)) $((x * 2))"'
    3 4
    
por 09.11.2016 / 16:34
0

Parece que o ksh está fazendo algo diferente com a expansão aritmética; para contornar isso, eu explicitamente usaria a substituição aritmética, que se comporta como esperado no AIX 6 & AIX 7:

...
if [[ ( $((f_count * sleep_interval % alarm_interval)) -eq 0 ) && $f_count -gt 0 ]] 
...
    
por 09.11.2016 / 16:51
0

Talvez a resposta seja direta; você vê problema quando uma variável no início de uma expressão aritmética se expande para 0 (zero). Isto é para o operando esquerdo do -eq na expressão condicional do KSH - com -eq sendo a comparação numérica, o operador espera um número como seu operando esquerdo.

Ao expandir / avaliar o operador de operandos, é necessário executar três etapas: a) expandir variáveis, b) tira zeros à esquerda, c) avaliar a expressão; nesta ordem, você receberá o problema observado.

Se as versões antigas do Shell o fizessem nesta ordem: a) expandir variáveis, b) avaliar a expressão, c) tira os zeros iniciais; então você não verá o problema

    
por 17.01.2018 / 11:18

Tags