Por que “erro de sintaxe próximo do token inesperado”? [fechadas]

0

Eu tenho cerca de 10k (aproximadamente 180x50x2) arquivos CSV que quero unir como a seguir, mas o loop interno para fail por causa de alguns syntax error ; Não consigo ver o erro em lastFile

#!/bin/bash
dir='/home/masi/CSV/'
targetDir='/tmp/'
ids=(118 119 120)
channels=(1 2)
for id in ids;

        do
        for channel in channels;

                # example filename P209C1T720-T730.csv
                lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"
                # show warning if last file does not exist
                if [[ -f $lastFile ]]; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget="$targetDir'P'$id'C'$channel'.csv'"
                cat $dir'P'$id'C'$channel'T'*'.csv' > $filenameTarget

        done;
done

Erro

makeCSV.sh: line 12: syntax error near unexpected token 'lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"'
makeCSV.sh: line 12: '      lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"'

OS: Debian 8.5
Kernel do Linux: 4.6 backports

    
por Léo Léopold Hertz 준영 29.10.2016 / 09:45

2 respostas

2

Falta do no seu segundo loop:

for id in ids;

        do
        for channel in channels; do # <----- here ----

                # example filename P209C1T720-T730.csv
                lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"
                # show warning if last file does not exist
                if [[ -f $lastFile ]]; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget="$targetDir'P'$id'C'$channel'.csv'"
                cat $dir'P'$id'C'$channel'T'*'.csv' > $filenameTarget

        done;
done

Com base na discussão nos comentários, vejo sua confusão com a sintaxe do loop for .

Esta é a sintaxe aproximada do for loop:

for name in list; do commands; done

Sempre deve haver um do antes dos comandos e um ; (ou nova linha) seguido por done após os comandos.

Aqui está uma variação com mais linhas novas:

for name in list
do
    commands
done
    
por 29.10.2016 / 10:29
1

Está funcionando corretamente:

#!/bin/bash
dir='/home/masi/CSV/'
targetDir='/tmp/'
ids=(118 119 120)
channels=(1 2)
for id in ids ; do

        # Add do after ';'
        for channel in channels ; do

                # example filename P209C1T720-T730.csv
                lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"
                # show warning if last file does not exist
                if [[ -f $lastFile ]] ; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget="$targetDir'P'$id'C'$channel'.csv'"
                cat $dir'P'$id'C'$channel'T'*'.csv' > $filenameTarget

        done
done

Para o depurador bash do futuro, use: bash -x / caminho / para / seu / script .

    
por 29.10.2016 / 10:27