2016-11-02 86 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

你給了一個鏈接的特殊代碼的來源。在代碼下面,您可以找到註釋:
請注意,這並不會對數組中的每個元素分別進行迭代......而是它簡單地連接數組並將「two」作爲子字符串。如果測試確切的單詞「two」是否是數組中的元素,這可能會導致不良行爲。 @MartyMacGyver 13年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 

當你不能確定你的shell支持if [[ ... ]],您可以使用更輕便的情況下施工。
現在你看到比賽是如何進行的,你明白第19年也可能是閏年。更安全的方法是製作冒號爲:1852:1856:...: 的冒號並匹配*:${year}:*
讓每個改進都變得更加複雜?只是做一個函數isLeapYear(但下車話題)。編輯:
* *是通配符(表示任何字符串)。 p*m匹配pim,pam,程序和pugliam。 *8*匹配4 6 8 10但不匹配5 7 9。 在這種情況下,你可以讀取它作爲子字符串。
我加了冒號,因爲11868 1872 1876一子,但:1:不是:1868:1872:1876:

+0

喜@Walter一個 感謝的子字符串。但是,我認爲我必須重新提出我的問題。 * *表示什麼?他們是否孤立我正在尋找的子串? 冒號定義字符串的含義是什麼? 謝謝 – pugliam

相關問題