Erro de lançamento de script “=: não encontrado” [duplicado]

4

Considere:

#!/bin/ksh

db2 connect to MKTETLPS user ....... using ........

db2 "select count(*)  from etl.IDM_COLLAPSE_ORG_DEE c where c.IDM_PROCESS_STEP = 'I' and priority in ( '1','2','3','4','5') and c.update_ts < (current timestamp - 60 minutes) with ur"  > l.txt

$a = /is115/idm/dsproj/scripts/l.txt

        if [ $a -gt 0 ];
      then
        db2  "update etl.idm_collapse_org_dee
             set idm_process_step = NULL where priority in (
'1','2','3','4','5')
             and idm_process_step ='I'"
      else
          echo "All is well"
fi

Estou correndo acima do script e estou recebendo o erro abaixo. Como posso consertar isso?

./CORCleanup1.sh[8]: =:  not found.
./CORCleanup1.sh[10]: test: 0403-004 Specify a parameter with this command.
All is well
DB20000I  The SQL command completed successfully.
DB20000I  The TERMINATE command completed successfully.

db2 connect reset


db2 terminate
exit
    
por Manish Kumar 01.09.2018 / 12:18

2 respostas

11

As atribuições variáveis não devem incluir $ e espaços em torno de = . Eu também faria o dobro da citação. Portanto, a atribuição de variáveis deve ser semelhante à seguinte.

a="/is115/idm/dsproj/scripts/l.txt"

Depois de ler o script, parece que você prefere armazenar o conteúdo do arquivo 1.txt in $a em vez do próprio caminho do arquivo. Para esse propósito, você pode usar a tarefa da seguinte forma.

read -r a < /is115/idm/dsproj/scripts/l.txt

( read -r lê a primeira linha do arquivo, retira os espaços e tabulações iniciais e finais (assumindo o valor padrão $IFS ) e os armazena na variável fornecida)

Você também pode querer duplicar a variável $a na instrução if .

if [ "$a" -gt 0 ];

Você também pode usar o link para verificar a sintaxe do seu script.

    
por 01.09.2018 / 12:41
4

Veja por que você está vendo esse erro:

$a = /is115/idm/dsproj/scripts/l.txt

Neste ponto do código, a variável a não está definida. O ksh substituirá a variável pela string vazia, resultando em:

 = /is115/idm/dsproj/scripts/l.txt

Então o ksh tenta executar a linha, tenta localizar o comando = , não consegue encontrá-lo e produz o primeiro erro que você vê.

Como @Thomas aponta, a sintaxe para a atribuição de variáveis é

varname=value

sem $ no lado esquerdo e sem espaços em torno de = . O link indicará esses erros.

Então você tem

    if [ $a -gt 0 ];

Como a não tem valor, o ksh realiza a substituição e tenta fazer

    if [  -gt 0 ];

O comando [ (sim, é um comando, com alias ao comando test ) não entende o operador ‑gt sem um operando à esquerda e você obtém a segunda mensagem de erro.

O comando [ sai com status diferente de zero, a instrução if , em seguida, executa o bloco else e você recebe a mensagem "tudo está bem".

É por isso que é importante citar todas as variáveis entre parênteses únicos [ ... ]

    if [ "$a" -gt 0 ];

Mais geralmente, sempre cite variáveis a menos que você entenda especificamente quando omitir as aspas. Veja também Implicações de segurança do esquecimento de citar uma variável em shells bash / POSIX

    
por 01.09.2018 / 16:27