Alterar no script de shell

0

Eu estava usando um script bash para fazer alguns testes automatizados em uma CLI. De repente, parece que não funciona. Parece que nossos devops fizeram algumas alterações no sistema operacional.

O erro que vejo é

bash-3.2$ sh cli-unit.sh 
cli-unit.sh: line 53: syntax error near unexpected token '('
cli-unit.sh: line 53: ' if ! diff < (echo "$EXPECTED") < (echo "$FOUND") > /dev/null; then'

A parte do código é

runTest() {
    local TITLE="$1"
    local BODY="$2"
    COUNTER=$((COUNTER + 1))

    local SHELL=$(getShell "$BODY")
    local EXPECTED=$(getOutput "$BODY")
    local FOUND=$(eval "$SHELL")

    if ! diff <(echo "$EXPECTED") <(echo "$FOUND") > /dev/null; then
        echo "--- FAIL: $TITLE"
        diff <(echo "$EXPECTED") <(echo "$FOUND")
        return 1
    fi
    PASSED=$((PASSED + 1))
    return 0
}

Alguém pode mudar / corrigir isso para mim? Eu não consigo corrigi-lo. Agradecemos antecipadamente.

    
por sovenkat 08.03.2018 / 05:53

1 resposta

1

Seu script é claramente um script bash , mas você está usando o sh .

Em vez de usar explicitamente sh para iniciar o script,

  1. Use bash ou
  2. Torne o script executável e adicione uma #! -line apropriada na primeira linha que aponta para o intérprete bash e execute o script com ./cli-unit.sh .

Não é possível esperar que o sh shell entenda a sintaxe do shell bash -específico.

Eu tenho mais alguns problemas com algumas das coisas que você mostra no script:

  • Use nomes de variáveis de shell minúsculas para que eles não entrem em conflito acidentalmente com as variáveis de ambiente do sistema. No código, você define SHELL , que geralmente é o caminho para o interpretador de shell atual.
  • Não use diff para fazer uma comparação de string. Basta fazer if [ "$variable1" != "$variable2" ] para testar a desigualdade.
  • Use printf em vez de echo para gerar dados variáveis (consulte " Por que o printf é melhor que o eco? ").

Endereçando o diff :

if [ "$FOUND" != "$EXPECTED" ]; then
    # code as before
    return 1
fi
# code as before
return 0

Dentro da ramificação if , você ainda pode usar diff para mostrar a diferença (especialmente se outro script ou usuário estiver esperando esse tipo de saída desta roteiro). Outra opção seria fazer

if [ "$FOUND" != "$EXPECTED" ]; then
    # $FOUND is different from $EXPECTED
    printf 'FAIL (%s): Found: %s\n' "$TITLE" "$FOUND"
    printf 'FAIL (%s): Expected: %s\n' "$TITLE" "$EXPECTED"
    # other code here
 fi
 # rest of script

ou algo similar.

    
por 08.03.2018 / 07:28