Sys-Admin Forum

Прошу провести ревью кода bash (у кого есть минутка)

Добрый день, уважаемые форумчане
Я уже вам очень благодарен, хотя бы за то что вы зашли в эту тему
Тут я хочу попросить о помощи
У меня свой проект, я и разраб и админ и тестировщик

Суть в том, что у меня есть работающий скрипт, который запускается кроном
Даже открыв код я и вы увидите, что он не гибок:
-Криво прописаны переменные для sql скрипта
-нет анализа ошибок mysql
-это приведет к удалению файла без корректной обработки

И это то что я заметил, уверен что есть еще вопросы…

Собственно в файле я объеденил 2 файла (sh и sql)

  1. У меня просьба провести ревью кода, дать свой вердикт, чтобы я по нему смог погуглить как внести доработки
  2. Подсказать как мне корректно передать переменную в скрипт, потому что сейчас в проекте очень много дублированных sql файлов, именно из-за того что я не знаю как передать переменную, прописываю ее в файле жестко.
  3. Как мне проводить анализ ошибок, чтобы не удалять исходный файл при их наличии, при этом, например, вызвать php скрипт для отправки аллерта в телеграмм
#!/bin/bash
files=/home/*****/ringup_good/*
newfile=/home/*****/ringup_good.csv
logfile=/home/******/log/pragent_first_ringup_good.log

cat $files | iconv -f CP1251 -t UTF-8 > $newfile;
cat $newfile >> $logfile;
rm $files;
mysql -u user -ppwd --local-infile DB -e "source /home/*****/pragent_first_ringup_good.sql;";
rm $newfile;

///////////////////////////////////////
////////////////SQL FILE pragent_first_ringup_good.sql

SET @project='pragent', @ringup='noans', @type=1;

CREATE TEMPORARY TABLE autoringup_hist_tmp
SELECT DateTime,Abon,DialTime,WaitTime,AbMsgTime,MsgTime,DialSignal,pc_id
from general.autoringup_hist
where 1=2
;
commit;

LOAD DATA LOCAL INFILE '/home/*****/ringup_noans.csv'
INTO TABLE autoringup_hist_tmp
CHARACTER SET UTF8
FIELDS TERMINATED BY ';' 
OPTIONALLY ENCLOSED BY '\"' 
LINES TERMINATED BY '\n' 
(@dttm,Abon,DialTime,WaitTime,AbMsgTime,MsgTime,DialSignal,pc_id)
SET DateTime = STR_TO_DATE(@dttm,'%d.%m.%Y %H:%i:%s')
;
commit;

insert into general.autoringup_hist
(DateTime,Abon,DialTime,WaitTime,AbMsgTime,MsgTime,DialSignal,ringup,pc_id,project,type)
select 
	DateTime,Abon,DialTime,WaitTime,AbMsgTime,MsgTime,DialSignal,@ringup,pc_id,@project,@type
from autoringup_hist_tmp
;
commit;

update privat.pragent_main_data t1, autoringup_hist_tmp t2
set t1.date_noans = t2.DateTime,
	t1.cnt_noans = t1.cnt_noans+1,
	t1.inwork = 0,
	t1.date_o = now()
where t1.phone = t2.Abon
;
commit;

Дубль:
https://pastebin.com/RLdSGFXr

Привет. Можно укоротить конструкцию logile, newfile:

cat $files | iconv -f CP1251 -t UTF-8 | tee -a newfile logfile

Далее, передача параметров. Используй такую конструкцию:

scipt.sh param1 param2 param3

В скрипте, это будет $1 $2 $3, пример:

cat ../test.sh
#!/bin/bash

echo $1 $2 $3

Результат:

bash ../test.sh test1 test2 test3
test1 test2 test3

Далее твой скрипт, можно использовать такую конструкцию:

mysql --user=root -ppass <<_EOF_
  # твой SQL скрипт
_EOF_

Куда можно передавать параметры из аргументов $1, $2, $3, например:

grant all privileges on zabbix.* to [email protected] identified by '${1}';

Все в куче (пишу на глаз, поэтому перепроверь):

#!/bin/bash
files="/home/*****/ringup_good/*.*"
newfile="/home/*****/ringup_good.csv"
logfile="/home/******/log/pragent_first_ringup_good.log"

cat $files | iconv -f CP1251 -t UTF-8 | tee -a $newfile $logfile

mysql --user=root -ppass --local-infile DB <<_EOF_
SQL FILE pragent_first_ringup_good.sql

SET @project='pragent', @ringup='noans', @type=1;

CREATE TEMPORARY TABLE autoringup_hist_tmp
SELECT DateTime,Abon,DialTime,WaitTime,AbMsgTime,MsgTime,DialSignal,pc_id
from general.autoringup_hist
where 1=2
;
commit;

LOAD DATA LOCAL INFILE '${newfile}'
#...
_EOF_

rm $newfile

В конструкции EOF нужно проверить на знаки которые нужно экранировать, поэтому на тестовой базе попробуй.

Или есть еще вариант, в готовый sql файл отправить данные и на лету заменить через sed, например:

sed -i 's/# HOST=.*/HOST=localhost/' $newfile

Где значение # HOST= заменяется на HOST=localhost