Итак, у меня есть сценарий, который я использую для разбора различных файлов журнала с разными столбцами и значениями. Я пытался использовать getopts, чтобы позволить моему скрипту запускать разбор по файлам в одном каталоге и сохранять вывод в другой каталог. По существу команда (должно быть):Bash Script с использованием getopts - использовать каталог как аргумент
./script.sh -i /absolute/input/dir/ -o /absolute/output/dir/
В настоящее время, если сценарий находится в директории с файлами журналы, он будет
проверка первого 4 и последние 4 из каждого файла, на основе эти результаты анализируют файл определенным образом, выводят изменения в назначенный выходной каталог, переходят к следующему файлу, заканчивают.
Теперь, если я переведу скрипт за пределами каталога журнала, я не могу заставить его выполнять какие-либо действия над файлами.
Вот пример моего кода:
#!/bin/bash
while getopts ":i:o:" opt; do
case $opt in
i)
indir="$OPTARG"
;;
o)
outdir="$OPTARG"
;;
\?)
echo "invalid option"
exit 0
esac
done
shift $((OPTIND-1))
for f in *.log
do
shopt -s nocasematch
f4l4="${f:0:4}${f:${#f}-4}"
if [[ "${f4l4}" = "this.log" ]]; then
tr -cd "[:print:]\n" < $f | awk -F, 'BEGIN{OFS=FS}for(i=6,i<8;i++) $i=sprintf(%02X,$i)}1' > $outdir$f.csv
sed -i '1icolumn1,column2,column3,column4,5,6,7,8,etc' $outdir$f.csv
elif [[ "${f4l4}" = "that.log" ]]; then
parse log file another way < $f | sed this and that > $outdir$f.csv1
fi
done
Так что я попытался использовать переменную $indir
внутри для оператора ($indir$f instead of $f
), но это не сработало. Если я echo $f
, то я могу увидеть все файлы в каталоге, но сценарий просто ничего не сделает.
Короче говоря, я хочу использовать getopts, чтобы указать каталог ввода, который содержит файлы для редактирования, и выходной каталог для отредактированных файлов, которые будут сохранены.
Мысли?
'INDIR = "$ Optarg"; cd "$ indir"; .... '? Или лучше иметь код, чтобы добавить '/' между dir и файлом, т. Е. 'Tr -cd '[: print:] \ n" <$ indir/$ f'? То же самое для '$ outdir/$ f'. Удачи. – shellter