Я хотел бы сделать следующее в сценарии bash:
Вот мой код:
#!/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
Что не так с объединением?
Если само allto468
имеет окончание строки \ r \ n, то $ line будет выглядеть как 468-R11\r
, и этот файл, безусловно, не найден.
Решения
dos2unix
для файла allto468, чтобы решить проблему один раз, изменяют строку done
на
done < <(sed 's/\r$//' /home/bono/RD/BV-OUT/allto468)
Кажется, что 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
Для меня это похоже на проблему с цитированием. Чтобы заставить работать подстановку переменных, используйте «», а не «», то есть замените:
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
.