Как конкретизировать строки в сценарии bash для использования в SQL-Statement? [закрыто]

3

Я хотел бы сделать следующее в сценарии bash:

  1. прочитайте несколько файлов из файла с именами файлов
  2. установить путь ввода переменных
  3. concat 1. и 2.
  4. использовать 3. в sql-statement

Здесь мой код:

 #!/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

Эхо показывает правильный путь и filenamen, но mysql всегда говорит:

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

Я пробовал разные способы конкретизации двух строк, но никто не работал :(

Следующий код работает с mysql (без конкатенации), но это не то, что мне нужно:

 #!/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

Что не так с concate?

    
задан Bono 07.02.2014 в 18:48
источник

3 ответа

2

Если сам allto468 имеет окончание строк \ r \ n, тогда строка $ будет выглядеть как 468-R11\r , и этот файл, безусловно, не найден.

Решение

  1. запустите dos2unix в файле allto468, чтобы устранить проблему один раз,
  2. измените строку done на

    done < <(sed 's/\r$//' /home/bono/RD/BV-OUT/allto468)
    
ответ дан glenn jackman 07.02.2014 в 20:02
источник
3

Кажется, что RDFile не существует в вашем первом скрипте. Что у вас в /home/bono/RD/BV-OUT/allto468 ? Являются ли они именами файлов, которые действительно существуют в /home/bono/RD/BV-OUT/ ?

Я бы добавил тест посередине, чтобы проверить, действительно ли построенный путь существует, например:

#!/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
    
ответ дан janos 07.02.2014 в 18:58
0

Для меня это выглядит как котировка. Чтобы получить замену переменных, используйте «" », а не« », то есть замените:

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  

с:

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

Чтобы проверить смешные символы в имени файла, echo "$RDFile" | od -bc .

    
ответ дан waltinator 08.02.2014 в 04:42