Следующий простой сценарий управления версиями предназначен для поиска номера последней версии данного файла, увеличения его, выполнения заданной команды с вновь созданным файлом (например, редактором) и после этого сохранения его в стабильной версии. Поскольку это просто, он ничего не проверяет, так как скрипт будет изменен по мере необходимости. Например, если результат не будет стабильным, пользователь может опустить последний аргумент.
Тем не менее, одна из основных проблем текущей функциональности заключается в том, как реализовать следующее: если в последнем разделе после точки есть две цифры, включите до 99; если только 1, то прибавляем до 9, потом переходим к предыдущему разделу. Версии могут иметь любое положительное целое число секций.
1.2.3.44 -> 1.2.3.45
1.2.3.9 -> 1.2.4.0
1.2.3 -> 1.2.4
9 -> 10
Оставшаяся проблема заключается в том, что он не ждет, пока редактор вина с вкладками закроет файл; цель состоит в том, чтобы определить, когда вкладка закрыта. Кроме того, не могли бы вы объяснить, как лучше всего убедиться, что мои имена переменных не перезаписывают существующие?
Вы также можете предложить другие улучшения.
#!/bin/bash
#Tested on bash 4.1.5
#All arguments in order: "folder with file" "file pattern" cmd [stable name]
folder="$1"
file_pattern="$2"
cmd="$3"
stable="$4"
cd "$folder"
last_version=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
sed -nr 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p' | \
sort -Vu | \
tail -n 1)
last_version_file=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
grep $last_version | \
tail -n 1) #tail -n 1 is only needed to get 1 line if there are backup files with the same version number
new_version=$(echo $last_version | \
gawk -F"." '{$NF+=1}{print $0RT}' OFS="." ORS="") #increments last section indefinitely
new_version_file=$(echo "$last_version_file" | \
sed -r "s/$last_version/$new_version/")
cp "$last_version_file" "$new_version_file"
"$cmd" "$new_version_file" & \
wait #works with gedit but not with wine tabbed editor
[[ "$stable" ]] && \
cp "$new_version_file" "$stable" #True if the length of string is non-zero.
Обновление: на моем компьютере работает следующее, я обновлю его, если будут найдены улучшения или решения нерешенных проблем:
#!/bin/bash
inc()
{
shopt -s extglob
num=${last_version//./}
let num++
re=${last_version//./)(}
re=${re//[0-9]/.}')'
re=${re#*)}
count=${last_version//[0-9]/}
count=$(wc -c<<<$count)
out=''
for ((i=count-1;i>0;i--)) ; do
out='.\\'$i$out
done
sed -r s/$re$/$out/ <<<$num
}
folder="$1"
file_pattern="$2"
cmd="$3"
stable="$4"
cd "$folder"
last_version=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
sed -nr 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p' | \
sort -Vu | \
tail -n 1) #--almost-all do not list implied . and ..
last_version_file=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
grep $last_version | \
tail -n 1) #tail -n 1 is only needed to get 1 line if there are backup files with the same version number
new_version=$(inc)
new_version_file=$(echo "$last_version_file" | \
sed -r "s/$last_version/$new_version/")
cp "$last_version_file" "$new_version_file"
"$cmd" "$new_version_file" && \
wait #works with gedit but not tabbed wine editor
[[ "$stable" ]] && \
cp "$new_version_file" "$stable" #True if the length of string is non-zero.
Я ценю разнообразие предложенных решений, поскольку они помогают составить представление и провести сравнение.
9.9.9
? Быть9.10.0
или10.0.0
? - person kev   schedule 28.12.201110.0.0
- person kev   schedule 28.12.2011