shell 脚本中带有版本比较的文件名
File name with versions comparison in shell script
假设我有像 abc-1.0.sh,xyz-1.0.sh,pqr-1.0.sh,abc-2 这样的文件名。 0.sh,abc-3.0.sh.
我正在尝试数组概念,但无法做到。
我只希望文件名为 abc-3.0.sh,xyz-1.0.sh,pqr-1.0.sh。
.sh
文件中应该怎么做?
这是一个 bash
脚本(需要 bash
4.3+),大致可以完成您想要做的事情:
filenames=( abc-1.0.sh xyz-1.0.sh abc-3.1.sh pqr-1.0.sh abc-2.0.sh abc-3.10.sh )
declare -A suffixes majors minors
for filename in "${filenames[@]}"; do
stem=${filename%%-*} # "abc-xx.yy.sh" --> "abc"
suffix=${filename#*-} # "abc-xx.yy.sh" --> "xx.yy.sh"
# Figure out major and minor version from "$suffix"
major=${suffix%%.*} # "xx.yy.sh" --> "xx"
minor=${suffix#*.} # "xx.yy.sh" --> "yy.sh"
minor=${minor%%.*} # "yy.sh" --> "yy"
if [ -z "${suffixes[$stem]}" ] ||
[ "$major" -gt "${majors[$stem]}" ] ||
( [ "$major" -eq "${majors[$stem]}" ] &&
[ "$minor" -gt "${minors[$stem]}" ] )
then
suffixes[$stem]=$suffix
# Remember the largest parsed "xx.yy" for this stem
majors[$stem]=$major
minors[$stem]=$minor
fi
done
for stem in "${!suffixes[@]}"; do
printf '%s-%s\n' "$stem" "${suffixes[$stem]}"
done
这个脚本输出
pqr-1.0.sh
xyz-1.0.sh
abc-3.10.sh
它解析文件名并提取词干(破折号之前的位)和后缀(破折号之后的位),然后从中提取主要版本和次要版本后缀。然后,它使用一组关联数组 suffixes
、majors
和 minors
,将版本组件与先前找到的该特定词干的最新版本进行比较。如果以前没有看到该词干,或者如果看到的词干的版本较低,则会使用该词干的信息更新数组。
最后输出合并后的数据。
这段代码的限制是文件名总是在表格中
stem-xx.yy.something
并且 xx
和 yy
总是整数。
假设我有像 abc-1.0.sh,xyz-1.0.sh,pqr-1.0.sh,abc-2 这样的文件名。 0.sh,abc-3.0.sh.
我正在尝试数组概念,但无法做到。
我只希望文件名为 abc-3.0.sh,xyz-1.0.sh,pqr-1.0.sh。
.sh
文件中应该怎么做?
这是一个 bash
脚本(需要 bash
4.3+),大致可以完成您想要做的事情:
filenames=( abc-1.0.sh xyz-1.0.sh abc-3.1.sh pqr-1.0.sh abc-2.0.sh abc-3.10.sh )
declare -A suffixes majors minors
for filename in "${filenames[@]}"; do
stem=${filename%%-*} # "abc-xx.yy.sh" --> "abc"
suffix=${filename#*-} # "abc-xx.yy.sh" --> "xx.yy.sh"
# Figure out major and minor version from "$suffix"
major=${suffix%%.*} # "xx.yy.sh" --> "xx"
minor=${suffix#*.} # "xx.yy.sh" --> "yy.sh"
minor=${minor%%.*} # "yy.sh" --> "yy"
if [ -z "${suffixes[$stem]}" ] ||
[ "$major" -gt "${majors[$stem]}" ] ||
( [ "$major" -eq "${majors[$stem]}" ] &&
[ "$minor" -gt "${minors[$stem]}" ] )
then
suffixes[$stem]=$suffix
# Remember the largest parsed "xx.yy" for this stem
majors[$stem]=$major
minors[$stem]=$minor
fi
done
for stem in "${!suffixes[@]}"; do
printf '%s-%s\n' "$stem" "${suffixes[$stem]}"
done
这个脚本输出
pqr-1.0.sh
xyz-1.0.sh
abc-3.10.sh
它解析文件名并提取词干(破折号之前的位)和后缀(破折号之后的位),然后从中提取主要版本和次要版本后缀。然后,它使用一组关联数组 suffixes
、majors
和 minors
,将版本组件与先前找到的该特定词干的最新版本进行比较。如果以前没有看到该词干,或者如果看到的词干的版本较低,则会使用该词干的信息更新数组。
最后输出合并后的数据。
这段代码的限制是文件名总是在表格中
stem-xx.yy.something
并且 xx
和 yy
总是整数。