我想将路径下的编号目录读取到 shell 脚本中的变量中。路径是这样的:
.../releases/R1/...
.../releases/R2/...
.../releases/R3/...
每次执行脚本时,我想将最新编号的 R(在本例中为 R3)目录读取到变量中,然后将其作为参数传递给脚本内的某些函数。我该怎么做呢?
答案1
如果您使用 zsh,这是最简单的,这要归功于它全局限定符:[-1]
保留最后一个匹配项并n
使用数字排序,以便匹配项R9
出现在 之前R10
。您还可以利用其<->
全局模式来匹配数字。
last_release=(releases/R<->(n[-1]))
if (($#last_release == 0)); then
echo 1>&2 "Fatal error: no release available"
exit 2
fi
仅使用便携式工具,最简单的方法是将数字排序卸载到sort
.如果目录中只有“驯服”文件名releases
(只有 ASCII 字符,没有控制字符,没有空格),则过滤 的输出ls
是生成文件名列表的便捷方法。
set_last_release () {
set -- $(ls releases | sed -n 's/^R\([0-9][0-9]*\)//p' | sort -rn)
if [ $# -eq 0 ]; then
echo 1>&2 "Fatal error: no release available"
exit 2
fi
last_release=releases/R$1
}
如果您在版本号中使用前导零,则可以依赖 shell 的内置排序。请注意,没有可移植的方法来仅匹配由R
一个或多个数字组成的文件名;在 ksh 中,您可以使用,如果您将其放在脚本的开头,releases/R+([0-9])
您也可以在 bash 中使用它(它必须在解析函数和执行函数时都有效)。shopt -s extglob
set_last_release () {
set -- releases/R[0-9]*
if [ "$1" = 'releases/R[0-9]*' ]; then
echo 1>&2 "Fatal error: no release available"
exit 2
fi
eval last_release=\$$#
}
答案2
那个怎么样:
DIRECTORY=$(ls .../releases | tail -n 1)
只要您的目录名称可以像字符串一样排序,这就可以工作。例如,“2”将位于“12”之后,除非您将“2”实际命名为“02”
答案3
只需尝试这个:
for dir in releases/R*[0-9]/; do
echo "$dir"
done