쉘 스크립트의 변수에 대한 경로 아래의 번호가 매겨진 디렉토리를 읽고 싶습니다. 경로는 다음과 같습니다.
.../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
하나 이상의 숫자로 구성된 파일 이름 만 일치시키는 이식 가능한 방법은 없습니다 . 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