根据带有通配符的输入过滤数组中的项目

根据带有通配符的输入过滤数组中的项目

我有一个来自命令输出的数组:

array=(saf sri trip tata strokes)

现在我想根据用户输入过滤项目。用户还可以使用通配符,因此如果用户输入*tr*,则输出应为

trip strokes

答案1

使用以下方法更容易zsh

$ array=(saf sri trip tata strokes)
$ pattern='*tr*'
$ printf '%s\n' ${(M)array:#$~pattern}
trip
strokes
  • ${array:#pattern}:扩展到数组的元素匹配模式。
  • (M)(对于匹配):恢复运算符的含义:#以扩展为匹配的元素
  • $~pattern,导致 的内容$pattern被视为模式。

答案2

一种方法是:

array=(saf sri trip tata strokes)                      
input=*tr*
for foo in "${array[@]}"; do
    case "$foo" in
        $input) printf '%s\n' "$foo" ;;
    esac
done

过度热情的引用者请注意:作业中的右侧(例如*tr*input=*tr*不需要引用。

相关内容