Case 文はアルファベット文字のみを許可しますか?

Case 文はアルファベット文字のみを許可しますか?
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

数字またはシンボルキャラクターです。あなたが望むようです:

  1. 英字のみ( [[:alpha:]])
  2. または、アルファベット文字でも構いませんが、ラテン文字のみが可能です(a-z提案どおり)。
  3. あるいは、発音区別記号なしでラテンアルファベットのアルファベット文字にすることもできます。

ロケールが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

allStéphane(ラテン語のアルファベット)、γράμμα(ギリシャ語のアルファベット)、письмо(キリル語のアルファベット)は許可されていますがfoo-bar123...は許可されていません。

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。これには、そのロケールのすべてのアルファベット文字(大文字と小文字)が含まれます。

関連情報