如何在 case 语句中匹配特定单词或其部分?

use*_*484 4 scripting shell-script posix case

假设有以下情况:

#!/bin/sh

case $1 in

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

esac
Run Code Online (Sandbox Code Playgroud)

对于这种情况,是否有更优雅且同时符合 POSIX 标准的解决方案(即,没有 bash、zsh 等)?

PS 不需要exampleeee或不需要Exam工作。

gle*_*man 5

你可以做的是扭转比较:

case "example" in
  "$1"*) echo OK ;;
  *) echo Error ;;
esac
Run Code Online (Sandbox Code Playgroud)

用多个词,你可以坚持你最初的想法

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

或使用循环和“布尔”变量

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
Run Code Online (Sandbox Code Playgroud)

您可以决定哪个更好。我认为第一个很优雅。

  • 可以进行的一项改进是检查与多个单词匹配的输入。例如,如果单词`exit` 被添加到列表中,那么`ex` 可以是它或`example`。空字符串也匹配所有内容。在这里,不明确的输入只会返回第一个匹配项。你可以在 `case` 中添加一个测试来查看 `$match` 是否已经被设置,如果是,则抛出一个错误。 (2认同)