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

Я хотел бы сделать следующее в сценарии 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

Эхо показывает правильный путь и имя файлаn, но 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

Что не так с объединением?

3
задан 7 February 2014 в 21:53

3 ответа

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

Решения

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

    done < <(sed 's/\r$//' /home/bono/RD/BV-OUT/allto468)
    
0
ответ дан 7 February 2014 в 21:53

Кажется, что 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
0
ответ дан 7 February 2014 в 21:53

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

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.

0
ответ дан 7 February 2014 в 21:53

Другие вопросы по тегам:

Похожие вопросы: