Freedo Asked: 2018-01-20 06:31:07 +0800 CST2018-01-20 06:31:07 +0800 CST 2018-01-20 06:31:07 +0800 CST case 语句只允许字母字符? 772 case "$1" in all) echo "$1" ;; [a-z][a-z][a-z][a-z][a-z][a-z]) echo "$1" ;; *) printf 'Invalid: %s\n' "$3" exit 1 ;; esac 有了这个,唯一接受的输入是全部和 6 个字符。它不接受 4 个字符或超过 6 个字符。 我在这里要做的是只允许字符,而不是数字或符号,但长度不受限制。 什么是正确的语法?谢谢 bash case 3 个回答 Voted Stéphane Chazelas 2018-01-20T06:48:35+08:002018-01-20T06:48:35+08:00 数字或符号是字符。看起来你想要: 仅字母字符 ( [[:alpha:]]) 或可能是字母字符,但仅限于拉丁文(如您a-z所建议的那样) 或者可能是拉丁文字中的字母字符,并且没有变音符号。 除非语言环境是 C/POSIX,否则匹配在(至少在 GNU 系统上)[a-z]或多或少是随机的。bash 对于 1,您需要: die() { printf >&2 '%s\n' "$1" exit 1 } case $string in ("") die "Can't be empty";; (*[![:alpha:]]*) die "contains non-alphabetical characters";; (*) echo OK esac 那将接受all,Stéphane(拉丁文),γράμμα(希腊文),письмо(西里尔文),但不接受foo-bar,123... 2 可能很棘手,特别是如果您想考虑组合变音符号。 对于 3,要使其在任何语言环境中运行,您需要指定所需的字符: ok=abcdefghijklmnopqstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 并在case声明中,使用 (*[!$ok]*) die "contains characters not allowed";; 或者您可以切换到基于字符代码点的zsh范围,因此始终只包含 abcdefghijklmnopqstuvwxyz 或使用 bash 4.3 或更高版本使用该选项在.[a-zA-Z]globasciirangebash Best Answer ilkkachu 2018-01-20T07:09:39+08:002018-01-20T07:09:39+08:00 您可以使用标准模式匹配来执行此操作,方法是查找任何不允许的字符,如果找到则拒绝输入。或者,您可以使用扩展的 glob ( extglob) 或正则表达式,并明确确保整个字符串由允许的字符组成。 #/bin/bash shopt -s extglob globasciiranges case "$1" in *([a-zA-Z])) echo "case ok" ;; esac [[ "$1" = *([a-zA-Z]) ]] && echo " [[ ok" [[ "$1" =~ ^[a-zA-Z]*$ ]] && echo "rege ok" globasciiranges防止[a-z]匹配重音字母,但正则表达式匹配不服从它。使用正则表达式,您需要设置LC_COLLATE=C以防止匹配它们。 所有这些都允许空字符串。为防止这种情况,请将星号更改为加号(*to +)。 user1404316 2018-01-20T10:48:59+08:002018-01-20T10:48:59+08:00 如果您正在使用bash或等效,请在脚本的顶部包含该行set -s extglob以启用扩展通配符(正则表达式的一种形式),然后在您的case语句中,将您的选择器设置为+([[:alpha:]]),当然后面是)所需的case声明本身。 alpha是手册页中定义的几个字符类之一。bash它包含您所在地区的所有字母字符,大写和小写。
数字或符号是字符。看起来你想要:
[[:alpha:]]
)a-z
所建议的那样)除非语言环境是 C/POSIX,否则匹配在(至少在 GNU 系统上)
[a-z]
或多或少是随机的。bash
对于 1,您需要:
那将接受
all
,Stéphane
(拉丁文),γράμμα
(希腊文),письмо
(西里尔文),但不接受foo-bar
,123
...2 可能很棘手,特别是如果您想考虑组合变音符号。
对于 3,要使其在任何语言环境中运行,您需要指定所需的字符:
并在
case
声明中,使用或者您可以切换到基于字符代码点的
zsh
范围,因此始终只包含 abcdefghijklmnopqstuvwxyz 或使用 bash 4.3 或更高版本使用该选项在.[a-zA-Z]
globasciirange
bash
您可以使用标准模式匹配来执行此操作,方法是查找任何不允许的字符,如果找到则拒绝输入。或者,您可以使用扩展的 glob (
extglob
) 或正则表达式,并明确确保整个字符串由允许的字符组成。globasciiranges
防止[a-z]
匹配重音字母,但正则表达式匹配不服从它。使用正则表达式,您需要设置LC_COLLATE=C
以防止匹配它们。所有这些都允许空字符串。为防止这种情况,请将星号更改为加号(
*
to+
)。如果您正在使用
bash
或等效,请在脚本的顶部包含该行set -s extglob
以启用扩展通配符(正则表达式的一种形式),然后在您的case
语句中,将您的选择器设置为+([[:alpha:]])
,当然后面是)
所需的case
声明本身。alpha
是手册页中定义的几个字符类之一。bash
它包含您所在地区的所有字母字符,大写和小写。