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

Sha*_*que 6 bash array shell-script

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

array=(saf sri trip tata strokes)
Run Code Online (Sandbox Code Playgroud)

现在我想根据用户输入过滤项目。用户也可以使用通配符,所以如果用户输入*tr*,输出应该是

trip strokes
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 8

使用zsh以下方法更容易:

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


Sat*_*ura 6

一种方法:

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

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