ケースステートメントで特定の単語やその一部を一致させる方法は?

ケースステートメントで特定の単語やその一部を一致させる方法は?

次の状況を想定します。

#!/bin/sh

case $1 in

e|ex|exa|exam|examp|exampl|example) echo "OK"
;;
t|te|tes|test) echo "Also OK"
;;
*) echo "Error!"
;;

esac

この状況について、よりエレガントで同時にPOSIX準拠のソリューションがあります(例:bash、zshなどはありません)。

PS必要もなくexampleeee仕事もExamありません。

ベストアンサー1

あなたができることは比較を逆にすることです:

case "example" in
  "$1"*) echo OK ;;
  *) echo Error ;;
esac

複数の単語を使用すると、元のアイデアに固執することができます。

case "$1" in
  e|ex|exa|exam|examp|exampl|example) : ;;
  t|te|tes|test) : ;;
  f|fo|foo) : ;;
  *) echo error ;;
esac

または、ループと「ブール」変数を使用してください。

match=""

for word in example test foo; do
  case "$word" in
    "$1"*) match=$word; break ;;
  esac
done

if [ -n "$match" ]; then
  echo "$1 matches $match"
else
  echo Error
fi

どちらが良いかを決めるのはあなた次第です。最初のものはとてもエレガントだと思います。

おすすめ記事