2016-11-02 4 views
2

가능한 윤년이 포함 된 배열이 있는데 주어진 연도가이 배열에 속하는지 아닌지를 확인하고 싶습니다.어레이에 ksh의 값에 "case"가 포함되어 있는지 확인하십시오.

#!/bin/ksh 

leap_yrs=() 
for i in {1852..2010..4}; do 
    leap_yrs+=("$i") 
done 

은 내가 Check if an array contains a value 그것은 작동 다음 코드

year=1900 
case "${leap_yrs[@]}" in *"${year}"*) 
echo "it could be a leap year" 
;; 
esac 

여기했지만 그 이유를 모른다.

나는

year=1900 
case "$year" in *"${leap_yrs[@]}"*) 
echo "it could be a leap year" 
;; 
esac 

같은 것을 쓴 것이다하지만이 작동하지 않습니다.

설명이 있습니까? 감사

MatteP

답변

0

당신은 특수 코드의 소스에 대한 링크를했다. 코드 아래에 주석을 찾습니다. 이 코드는 배열의 각 요소를 개별적으로 반복하지 않고 단순히 배열을 연결하고 "2"를 부분 문자열로 찾습니다. 정확히 "2"라는 단어가 배열의 요소인지 여부를 테스트하는 경우 바람직하지 않은 동작이 발생할 수 있습니다. @MartyMacGyver 2011 년 8 월 19 일 23시 21 분

또 다른 설명.

은 무슨 일이 일어나고 있는지 확인하기 위해 다음 명령을보십시오 (또는 set -x 사용) :

echo case "${leap_yrs[@]}" in *"${year}"* 

if [[ "1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1900 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008" = *1900* ]] 
then 
    echo "Found" 
fi 

if [[ ${leap_yrs[@]} = *1900* ]] 
then 
    echo "Also found" 
fi 

당신이 당신의 쉘 if [[ ... ]]를 지원하는지 확실하지 않은 경우, 당신은 더 많은 휴대용 케이스 구조를 사용할 수 있습니다.
어떻게 일치하는지 확인 했으므로 19 년도가 윤년이 될 수도 있음을 이해합니다. 더 안전한 방법은 :1852:1856:...: 과 같은 콜론으로 문자열을 만들고 *:${year}:*과 일치시키는 것입니다.
각 개선 사항을 이해하기가 더 복잡해 집니까? 그냥 isLeapYear 함수를 만든다. (그러나 주제를 벗어나기).

편집 :
* *은 와일드 카드 (모든 문자 문자열을 나타냄)입니다. p*m은 pim, pam, program 및 pugliam과 일치합니다. *8*4 6 8 10과 일치하지만 5 7 9과 일치하지 않습니다. 이 경우 하위 문자열로 읽을 수 있습니다. 11868 1872 1876의 문자열이지만, :1::1868:1872:1876:

+0

안녕 @Walter 감사의 하위 문자열이 아니기 때문에
나는, 콜론을 추가했다. 그런데 내 질문을 다시 말해야한다고 생각합니다. * *는 무엇을 의미합니까? 그들은 내가 찾고있는 하위 문자열을 분리합니까? 문자열을 정의 할 때 콜론의 의미는 무엇입니까? 감사합니다. – pugliam