2014-04-23 2 views
0

4 월 14 일에서 22 일 사이에 파일 목록을 생성하려고합니다.
파일 이름의 이름에 날짜가 표시됩니다 (예 : J0018658.WANCL90A.16Apr2014.214001.STD.txt.
이 스크립트를 사용해 보았습니다.쉘 스크립트 중첩 루프

for i in 14 15 16 17 18 19 20 21 22; do 
    for x in *$iApr*.txt; do 
     echo "$x" 
    done 
done 

저는 이것을 AIX에서 사용하고 있으며 기본 쉘은 ksh입니다. 그러나 sh 및 bash도 사용할 수 있습니다. 여기 KSH 작동 것입니다 :

for i in 14 15 16 17 18 19 20 21 22; do 
    for x in *${i}Apr*.txt; do 
     echo "$x" 
    done 
done 

여기에 떠들썩한 파티와도 잘 작동 것입니다 :

#!/bin/bash 

shopt -s nullglob 
for i in {14..22}; do 
    for x in *${i}Apr*.txt; do 
      echo "$x" 
    done 
done 

답변

3

당신이 원하는 것을하지 iApr이라는 변수를 확장하려고합니다. 그래서

for i in {14..22}; do 

:

for x in *${i}Apr*.txt; do 

은 또한 당신의 외부 루프는 @ anubhava의 대답의 개념과 유사 할 수 있습니다 : 대신

,이 같은 루프보기를위한 당신의 내면을 시도 스크립트는 다음과 같이 보일 것입니다 :

다시 한번 감사 shopt -s nullglob


소개 #!/bin/sh#!/bin/bash의 필요성을 지적 @anubhava :

리눅스를 실행하는 경우, 당신의 /bin/sh 단순히 /bin/bash에 심볼릭 링크 가능성이 높습니다. man 페이지에서 :

bash가 sh라는 이름으로 호출되면 POSIX 표준을 준수하면서 가능한 한 sh의 이전 버전의 시작 동작을 모방하려고 시도합니다.

+0

스크립트가 지금과 같다 : {14..22}에 내가위한'; do * $ {i} Apr * .txt에 x에 대해 \t; 그러나 출력이 그냥 \t 에코 "$의 X" \t 수행 done'을'* {14..22} 4월 는'bash'의 –

+0

어떤 버전 당신은 * 사용을 완료 한 .txt'? 스크립트 상단에'! #/bin/bash' 또는'#!/bin/sh'가 있습니까? {14..22} 확장을하려면 버전 3.2 이상,'! #/bin/bash'가 필요합니다. –

+0

내 'sh'가 너무 오래되었다고 생각합니다. 나는'/ bin/bash'로 전환했고 작동합니다. 감사합니다 –

2

당신은 할 수 있습니다 :

ls *{14..22}Apr*.txt 

또는 BASH에서을 :

shopt -s nullglob; echo *{14..22}Apr*.txt