Como conciliar strings em um script bash para usar em SQL-Statement? [fechadas]

3

Gostaria de fazer o seguinte em um script bash:

  1. leia alguns nomes de arquivos em um arquivo com nomes de arquivos
  2. definir um caminho de entrada variável
  3. concat 1. e 2.
  4. use 3. na instrução sql

Aqui meu código:

 #!/bin/bash
 INPath="/home/bono/RD/BV-OUT/"

 while 
 read line
 do
 RD="$line"
 RDFile="$INPath$RD"

 echo -e $RDFile

 ###MYSQLs:
 mysql -u root -D RD --local-infile << EOF
   LOAD DATA LOCAL INFILE '$RDFile'
     INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
 EOF
 ##### EOSQL

 done < /home/bono/RD/BV-OUT/allto468

O eco mostra o caminho certo e o filename, mas o mysql sempre diz:

not found (Errcode: 2 - File or Directory not found)  

Eu tentei maneiras diferentes de conciliar as duas strings, mas nenhuma funcionou :(

O código a seguir funciona com o mysql (sem o concate), mas não é o que eu preciso:

 #!/bin/bash

 while 
 read line
 do

 RDFile="/home/bono/RD/BV-OUT/468-R11"

 echo -e $RDFile

 ###MYSQLs:
 mysql -u root -D RD --local-infile << EOF
   LOAD DATA LOCAL INFILE '$RDFile'
     INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
 EOF
 ##### EOSQL

 done < /home/bono/RD/BV-OUT/allto468

O que há de errado com o concate?

    
por Bono 07.02.2014 / 18:48

3 respostas

2

Se o allto468 em si tiver \ r \ n terminações de linha, a linha $ parecerá com 468-R11\r , e esse arquivo certamente não será encontrado.

Soluções

  1. execute dos2unix no arquivo allto468 para corrigir o problema uma vez,
  2. altere a linha done para

    done < <(sed 's/\r$//' /home/bono/RD/BV-OUT/allto468)
    
por glenn jackman 07.02.2014 / 20:02
3

Parece que RDFile não existe no seu primeiro script. O que você tem em /home/bono/RD/BV-OUT/allto468 ? Eles são nomes de arquivos que realmente existem em /home/bono/RD/BV-OUT/ ?

Eu adicionaria um teste no meio para verificar se o caminho construído realmente existe, por exemplo, assim:

#!/bin/bash
INPath="/home/bono/RD/BV-OUT/"

while read line; do
    RD="$line"
    RDFile="$INPath$RD"
    echo $RDFile

    if ! test -f "$RDFile"; then
        echo error: file does not exist: $RDFile
        continue
    fi

    ###MYSQLs:
    mysql -u root -D RD --local-infile << EOF
LOAD DATA LOCAL INFILE '$RDFile'
 INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
EOF
    ##### EOSQL
done < /home/bono/RD/BV-OUT/allto468
    
por janos 07.02.2014 / 18:58
0

Parece um problema de citação para mim. Para obter a substituição de variável para o trabalho, use '"', não" '", isto é, substitua:

mysql -u root -D RD --local-infile << EOF  
LOAD DATA LOCAL INFILE '$RDFile'  
INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';  
EOF  

com:

mysql -u root -D RD --local-infile << EOF
LOAD DATA LOCAL INFILE "$RDFile"
INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
EOF

Para verificar caracteres engraçados no nome do arquivo, echo "$RDFile" | od -bc .

    
por waltinator 08.02.2014 / 04:42