シェルスクリプトの変数へのパスの下に番号が付けられたディレクトリを読みたいです。パスは次のとおりです。
.../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
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
}
バージョン番号の前に0を使用すると、シェルに組み込まれているソート機能を使用できます。R
1つ以上の数字で構成されるファイル名のみを一致させる移植可能な方法はありません。 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」「02」という名前を指定しない限り、「2」は「12」の後に続きます。
答え3
これを試してください:
for dir in releases/R*[0-9]/; do
echo "$dir"
done