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文字以上は使用できません。
ここでやりたいことは、数字や記号ではない文字だけを許可し、長さに制限を置かないことです。
正しい構文は何ですか?ありがとう
答え1
数字またはシンボルキャラクターです。あなたが望むようです:
- 英字のみ(
[[:alpha:]]
) - または、アルファベット文字でも構いませんが、ラテン文字のみが可能です(
a-z
提案どおり)。 - あるいは、発音区別記号なしでラテンアルファベットのアルファベット文字にすることもできます。
ロケールがC / POSIXでない限り、一致はやや[a-z]
ランダムですbash
(少なくともGNUシステムでは)。
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]
このglobasciiranges
オプションを使用すると、同じ動作が実行されます。bash
。
答え2
許可されていない文字を見つけて見つかった場合は、入力を拒否することで標準パターンマッチングを使用してこれを実行できます。またはあなたは使用することができます拡張グローバル(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 +
)に変更してください。
答え3
または、同等の機能を使用している場合は、bash
スクリプトの上部にその行を含めてset -s extglob
拡張機能を有効にしてください。ワイルドカード(正規表現の1つの形式)次に、ステートメントでcase
セレクタをに設定し+([[:alpha:]])
、もちろんステートメント自体)
で目的の内容をに設定しますcase
。
alpha
いくつかのキャラクタークラスマニュアルページで定義されていますbash
。これには、そのロケールのすべてのアルファベット文字(大文字と小文字)が含まれます。