내 호스트 이름은 다음과 같습니다
www-foo-1001-1-1.example.com
다음 문자열 일치를 사용하여 애플리케이션을 배포해야 하는 스크립트를 작성 중입니다.1001-<any digit>-<any digit>
예: 스크립트는 다음 호스트 이름과 일치해야 합니다.
www-foo-1001-1-49
www-foo-1001-4-37
www-foo-1001-2-12
www-foo-1001-8-4
호스트 이름에서 이 패턴을 무시하십시오.
www-foo-1001-1-2-49
www-foo-1001-1-1-49
www-foo-1001-1
www-foo-1001
이 패턴과 일치해야 1001-N-N
하며 다른 것은 무시해야 합니다.
실행에 대한 자세한 내용을 원하고 정규화된 호스트 이름과 일치하지 않는 오류를 발생시키는 상태 코드를 if then..
반환하고 싶습니다 .exit
$?
답변1
세게 때리다확장 모드내에서 활성화되므로 [[ ... ]]
다음을 수행할 수 있습니다.
hosts=( www-foo-1001-1-49 www-foo-1001-4-37 www-foo-1001-2-12 www-foo-1001-8-4 www-foo-1001-1-2-49 www-foo-1001-1-1-49 www-foo-1001-1 www-foo-1001 )
pattern='*-1001-+([[:digit:]])-+([[:digit:]])'
for h in "${hosts[@]}"; do
if [[ $h == $pattern ]]; then
echo "OK: $h"
else
echo "no: $h"
fi
done
OK: www-foo-1001-1-49
OK: www-foo-1001-4-37
OK: www-foo-1001-2-12
OK: www-foo-1001-8-4
no: www-foo-1001-1-2-49
no: www-foo-1001-1-1-49
no: www-foo-1001-1
no: www-foo-1001
내 패턴은 *-1001-
당신이 일치하고 싶지 않다고 가정하는 곳에서 시작됩니다 11001
.21001
==
in의 연산자는 [[ ... ]]
패턴 일치 연산자입니다.
오른쪽 피연산자는 패턴 변수이지만인용되지 않음. 이를 통해 변수의 값을 다음과 같이 해석할 수 있습니다.무늬하나도 아니야끈.
답변2
배시 사용:
$ touch www-foo-1001 www-foo-1001-1 www-foo-1001-1-1-49 www-foo-1001-1-2-49 www-foo-1001-1-49 www-foo-1001-2-12 www-foo-1001-4-37 www-foo-1001-8-4
$ for f in *
do
[[ $f =~ 1001-[[:digit:]]+-[[:digit:]]+$ ]] && printf 'Yes: %s\n' "$f"
done
Yes: www-foo-1001-1-49
Yes: www-foo-1001-2-12
Yes: www-foo-1001-4-37
Yes: www-foo-1001-8-4
이는 bash의 정규식 조건부 연산자를 사용하여 인수를 테스트합니다.
- 포함하다
1001-
- 그 뒤에 몇 개의 숫자가 따라온다
- 그 다음에
-
- 그 뒤에 몇 개의 숫자가 따라온다
- 다음은 아무것도 따르지 않습니다.
$
답변3
kapu@ppc:$ ls
www-foo-1001 www-foo-1001-1-1-49 www-foo-1001-1-49 www-foo-1001-4-37
www-foo-1001-1 www-foo-1001-1-2-49 www-foo-1001-2-12 www-foo-1001-8-4
kapu@ppc:$ ls | awk '/www-foo-1001-[0-9]+-[0-9]+$/{print}'
www-foo-1001-1-49
www-foo-1001-2-12
www-foo-1001-4-37
www-foo-1001-8-4