문자열 아래에서 조건부 연산자를 비교해야 합니다. 따라서 특정 작업은 81.1.4_r4345가 특정 작업을 수행하거나 "완료"와 일치하는 경우에만 수행됩니다.
vasanth-releases_81.1.4_r4345.tar.gz
vasanth-releases-done.tar.gz
If [[ $var == ‘vasanth-releases_{0-9}_{0-9}.tar.gz ]] ; then
echo ‘True’
Elsif [[ $var == ‘Vasanth-releases-{a-z}.tar.gz ]]; then
echo ‘False’
else
echo ‘default’
fi
위의 시도는 예상대로 작동하지 않았습니다. 따라서 이 두 파일에는 정규식 형식이 필요합니다. 이 문제를 해결하는 데 도움을 줄 수 있나요?
감사해요
답변1
귀하의 최종 목표가 무엇인지는 잘 모르겠지만 귀하의 코드에서 몇 가지 문제를 지적할 수 있습니다.
- 쉘 명령이나 내장 명령에는 대문자를 사용하면 안 됩니다
If
.if
elsif
유효하지 않습니다.elif
- 코드 편집에 적합하지 않은 워드 프로세서에서 복사하여 "둥근 따옴표"를 사용한 것일 수 있습니다.
- 둥근 따옴표를 일반 따옴표로 변경하더라도 첫 번째 조건에서 작은 따옴표를 열고 두 번째 조건까지 다시 닫지 않습니다.
=~
Bash에서는 정규식 비교를 위해 연산자가 아닌 연산자를 사용해야 합니다==
.- 중괄호는 정규식에서 원하는 것을 달성하지 못하므로 해당 범위 내의 모든 문자를 사용
[0-9]
하고 일치시켜야 합니다.[a-z]
- 정규식에서 괄호를 수정하더라도 여전히 파일과 일치하지 않습니다. regex101.com을 사용하여 올바른 정규식을 만들 수 있지만 bash는 정규식을 확장합니다. 이는 regex101에서 사용할 수 있는 옵션이 아니며 pcre는 가깝지만 교차 호환되지 않는 몇 가지 사항을 찾을 수 있습니다.
답변2
이와 같은 것을 찾고 계십니까?
#!/bin/bash
var="vasanth-releases_81.1.4_r4345.tar.gz"
if [[ $var =~ ^vasanth-releases_[0-9.]+_r[0-9]+\.tar\.gz$ ]]; then
echo ‘True’
elif [[ $var =~ ^vasanth-releases-[a-z]+\.tar\.gz$ ]]; then
echo ‘False’
else
echo ‘default’
fi
var="vasanth-releases-done.tar.gz"
if [[ $var =~ ^vasanth-releases_[0-9.]+_r[0-9]+\.tar\.gz$ ]]; then
echo ‘True’
elif [[ $var =~ ^vasanth-releases-[a-z]+\.tar\.gz$ ]]; then
echo ‘False’
else
echo ‘default’
fi