Строка содержит символ bash
В bash я пытаюсь проверить, является ли предложение панграммой.
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"
, Кто-нибудь знает, что не так с моим кодом?
Я пытался манипулировать кодом из моего предыдущего вопроса.
3 ответа
Ваш синтаксис почти правильный, но нуждается в большем повторении. Вам понадобится что-то вроде:
[[ "$sentence" =~ [Aa] && "$sentence" =~ [Bb] && "$sentence" =~ [Cc] && ... ]]
Есть, несомненно, более краткие способы сделать это.
Лучший и чистый способ проверки панграммы на 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}
и мы используем глоб (вместо регулярного выражения, которое было бы излишним в этом случае), чтобы проверить, $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
Можете ли вы использовать обычные команды *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