У меня есть сценарий bash, который находит подключенные устройства и записывает вывод последовательного порта в файл. Я использую getopts для выбора метода ведения журнала. Две функции одинаковы, за исключением одной строки. Я хотел бы изменить его на одну функцию с переменной для одной строки, которая отличается (моя попытка ниже), но не добилась успеха. Как я могу сделать это с помощью getopts? Большое спасибо.
#!/bin/bash
#script to capture camera serial port logs via usb or UART.
file_name='DashcamLog'
#Date e.g: 20210204T120159 (ISO 8601)
current_date=$(date +%Y%m%dT%H%M%S)
BAUDRATE='115200'
#change to reflect udev rules e.g /dev/h1*
BOARDS=(/dev/ttyUSB* /dev/ttyACM*)
screen="$(screen -Sdm $port_name -L -Logfile $new_file_name $i $BAUDRATE)"
minicom="$(screen -Sdm ${port_name} minicom -b ${BAUDRATE} -D ${i} -C ${new_file_name})"
usage() {
echo "Usage:"
echo "Use $0 -a to use GNU screen to automatically capture logs on USB plug in"
echo "Use $0 -s to use GNU screen to capture logs WITHOUT automatic capture on USB plug in."
echo "Use $0 -m to use minicom to capture logs WITHOUT automatic capture on USB plug in."
}
#detects current + new devices + automatically starts logging
autoStartLog() {
while true;do
current_date=$(date +%Y%m%dT%H%M%S)
for i in $BOARDS; do
port_name=${i#/dev/}
if ! screen -ls | grep -o $port_name > /dev/null;then
(
serial_no="$(udevadm info --attribute-walk $i | grep -m 1 ATTRS{serial})"
#file name e.g = DashcamLog_20210208T094013_peri_h1p1.log
new_file_name="${file_name}_${current_date}_${HOSTNAME}_${port_name}.log"
$screen
echo $port_name 'serial_no: ' $serial_no $new_file_name
)
fi
done
done
}
#detects current devices + starts logging using screen(-s)/minicom(-m)
startLog() {
for i in $BOARDS; do
(
port_name=${i#/dev/}
serial_no="$(udevadm info --attribute-walk $i | grep -m 1 ATTRS{serial})"
new_file_name="${file_name}_${current_date}_${HOSTNAME}_${port_name}.log"
$1
echo $port_name 'serial_no: ' $serial_no $new_file_name
)
done
}
while getopts ":hmsa" opt; do
case ${opt} in
h)
usage
;;
a)
autoStartLog
;;
s)
startLog $screen
;;
m)
startLog $minicom
;;
\? )
echo "Invalid Option: -$OPTARG" 1>&2
usage
exit 1
;;
esac
done
shift $((OPTIND -1))