检查数组是否包含ksh中的值" case"

时间:2016-11-02 17:56:03

标签: case ksh

我有一个包含可能的闰年的数组,我想检查给定的年份是否属于这个数组。

#!/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

1 个答案:

答案 0 :(得分:0)

您提供了指向特殊代码来源的链接。在代码下方,您可以找到评论:
请注意,这并不是单独迭代数组中的每个元素...而是简单地连接数组并匹配" two"作为子串。如果正在测试确切的单词" 2"这可能会导致不良行为。是数组中的元素。 @MartyMacGyver 8月19日' 13 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:的子字符串