2

bash中,我试图测试一个句子是否是一个 pangram。

read sentence
if [[ "$sentence" == [Aa] && [Bb] && [Cc] && [Dd] && [Ee] && [Ff] && [Gg] && [Hh] && [Ii] && [Jj] && [Kk] && [Ll] && [Mm] && [Nn] && [Oo] && [Pp] && [Qq] && [Rr] && [Ss] && [Tt] && [Uu] && [Vv] && [Ww] && [Xx] && [Yy] && [Zz] ]]; then
echo "pangram"
else
echo "not pangram"
fi

这是我到目前为止的代码,我得到的只是"not pangram". 有谁知道我的代码有什么问题?

我试图操纵我以前的问题中的代码。

4

3 回答 3

2

测试 pangram 的更好和更纯粹的 Bash 方法是(编写为函数):

is_pangram() {
    local l=${1,,} i
    for i in {a..z}; do
        [[ $l = *$i* ]] || return 1
    done
    return 0
}

该函数首先将其参数转换为小写: 的扩展${1,,}$1转换为小写的扩展;我们将此值存储在局部变量l中。然后我们循环遍历(小写字母)for i in {a..z}并使用 glob(而不是正则表达式,在这种情况下会过度杀伤)来检查是否$l包含字母。

那就试试吧:

$ if is_pangram "Cwm fjord bank glyphs vext quiz"; then echo "it's a pangram"; else echo "not a pangram"; fi
it's a pangram
$ if is_pangram "the horse jumps over the fence"; then echo "it's a pangram"; else echo "not a pangram"; fi
not a pangram
于 2014-10-21T08:06:52.867 回答
0

您的语法几乎是正确的,但需要更多重复。你需要类似的东西:

[[ "$sentence" =~ [Aa] && "$sentence" =~ [Bb] && "$sentence" =~ [Cc] && ... ]]

毫无疑问,有更简洁的方法可以做到这一点。

于 2014-10-21T01:54:47.433 回答
0

您可以使用常见的 *nix 命令,还是仅限于纯 bash 操作和内置命令?

如果允许排序,那么我会这样做:

#!/bin/bash

# Simple pangram tester.
# Doesn't handle non-alphabetic chars except space.

# Written by PM 2Ring 2014.10.21

is_pangram()
{
    count=$(echo -n ${1// /}|(while read -n 1 a;do echo $a;done)|sort -fu|wc -l)
    [[ $count -eq 26 ]]
}

test_pangram()
{
    if is_pangram "$1"
        then echo "'$1' is a pangram."
        else echo "'$1' is not a pangram."
    fi
}

teststrings=(
    "A quick brown fox jumps over the lazy dog"
    "This is a test" 
    "Cwm fjord bank glyphs vext quiz"
    "Is not a pangram"
)

for s in "${teststrings[@]}"
do
    test_pangram "$s"
done
于 2014-10-21T07:43:46.887 回答