2016-08-10 2 views
1

내 스크립트배쉬 문자 일치

#!/bin/bash 

shopt -s extglob 
for i in *.dat; 
do 
    if [[ "$i" == *(_TEx) ]];then 
     file1=$i 
    fi 
done 

echo file1="$file1" 

나는

262_V01_C00_R000_TEx_BL_2048H.dat 
262_V01_C01_R000_TEy_BL_2048H.dat 
262_V01_C02_R000_THx_BL_2048H.dat 
262_V01_C03_R000_THy_BL_2048H.dat 

그러나

[email protected]:~/procmt$ bash a8.sh 
file1= 
,536,913 파일 http://www.shellcheck.net/

$ shellcheck myscript 
No issues detected! 

와 스크립트를 테스트 한

왜?

+0

이것은이 패턴과 일치하는 파일이 없음을 의미합니다. – fedorqui

+0

@JohnKugelman 제 편집을 살펴보면 4 개의 파일이 있고 하나는 두 조건을 모두 충족합니다. –

답변

4

는이 될 것이라고 작동하도록 당신의 시도에 최소한의 수정 :

if [[ "$i" == *_TEx* ]]; then 

즉 괄호를 제거하고 패턴의 끝에서 누락 된 *를 추가합니다. 기능을 사용할 필요가 없으므로 extglob 쉘 옵션을 설정할 필요가 없습니다.

그러나, 당신은뿐만 아니라 당신이에 걸쳐 반복하는 글로브 변경 될 수 있습니다 :

for i in *_TEx*.dat; 

과 완전히 if을 피하십시오.

더 나은 아직, 당신은 직접 경기를 인쇄 할 수 있습니다 : 어떤 파일이 패턴과 일치하지 않는 경우는 어떤 결과가 유도로

shopt -s nullglob 
printf '%s\n' *_TEx*.dat # print all files matching the pattern 

nullglob 여기에 유용합니다.

3

*(_TEx)은 문자열만으로 구성된 파일 이름이 _TEx_TEx_TEx_TEx처럼 반복적으로 반복됩니다.

당신이 찾고있는 것은 *_TEx*입니다. 확장 된 glob 필요 없음. 그리고 이것을 이것을 *.dat glob과 결합하여 루프를 완전히 제거 할 수 있습니다.

echo *_TEx*.dat 
2

Tom Fenech's helpful answerJohn Kugelman's helpful answer간단한 globs의 기반으로 당신에게 효율적인 솔루션을 보여줍니다.

당신이 당신이 시도했듯이 (샘플 입력을 하지 필요가있는), 대체 (globbing)을 확장 사용하려면 : 루프 글로브에이 글로브를 접어,

[[ "$i" == *@(_TEx)* ]] 

또는 : 참고 [[ ... ]] 내부, 확장 대체 (globbing)은 암시 적으로 01 이라고하지만

for i in *@(_TEx)*.dat; do # ... 

shopt -s extglob 가정및 !=의 RHS에 대해은 Bash v4.1 +에서 켜져 있습니다.그 자체로


  • 전체 파일 이름에 대한 두 간단하고 확장 globs와 일치, 그래서 *(_TEx)는 충분하지 않습니다 - 당신이 * 문자를 둘러싸는 제공해야합니다. 패턴 전후의 문자를 일치시킬 수 있습니다.

  • 확장-글롭 구성 *(_TEx) 일치 없거나 효과적으로 일치 _TEx 이상의 발생 : (a) 빈 문자열 또는 _TEx의 반복 (b) 임의의 수; 동봉 된 * 문자와 결합하여 모두 파일 이름과 효과적으로 일치합니다. 대조적으로, @(_TEx)은 정확히의 일치가 _TEx과 일치합니다 (단, 참조 된 응답에서 보여 지듯이 단순한 glob에 _TEx을 포함하는 것은 똑같습니다).