Я пытаюсь написать сценарий для автоматизации вытягивания, рендеринга и нажатия на документ LaTeX с/на репо. Вытягивание/нажатие не проблема, но для начала рендеринга я хотел бы проверить, изменились ли файлы .tex
с момента последнего обновления (переменная oldHash
содержит информацию). Проблема в том, что когда я выполняю код, переменная счетчика сбрасывается до 0 после выхода цикла. Вот код:Невозможно изменить переменную счетчика
#!/bin/bash
##### PULL FROM THE REPO AND SAVE THE HASH #####
# Get the diff between the two commits
diffFiles=$(git diff --name-only "$oldHash" [email protected]{0})
# The commmand produces the following output:
# Chapters/Chapter6.tex
# Other/CustomEnvironments.tex
# RawMaterial/LinearAlgebraNotes_4.pdf
# buildAll.sh
# main.tex
numberOfTexFiles=0
# Loop through every line of the output and strip the files from their extension
printf %s "$diffFiles" | while IFS= read -r line
do
baseName=$(basename "$line")
extension="${baseName##*.}"
if [[ "$extension" == 'tex' ]]; then
# If the file is a Tex, update the counter
numberOfTexFiles=$(($numberOfTexFiles+1))
echo $numberOfTexFiles
fi
done
echo $numberOfTexFiles
if [ $numberOfTexFiles -gt 0 ]; then
echo "FILES HAVE CHANGED"
# Run some other stuff (namely pdflatex)
else
echo "NOTHING CHANGED"
fi
Что теперь происходит то, что последний, если заявления оценить ложь, и команда pdflatex
никогда не вызывается. Как я могу это исправить?
EDIT
Как было предложено JID, перенаправлять все, что мне было нужно. Это мое решение:
while IFS= read -r line
do
baseName=$(basename "$line")
extension="${baseName##*.}"
if [[ "$extension" == 'tex' ]]; then
# If the file is a Tex, update the counter
numberOfTexFiles=$(($numberOfTexFiles+1))
echo $numberOfTexFiles
fi
done <<< $(printf %s "$diffFiles")
не вставлять в цикл while использовать 'done <(command)' вместо 'command | в то время как '. Это задавали бесчисленные времена. поиск 'bash while circle scope' в google для получения дополнительной информации. –