如何检查 zsh 脚本的参数是否处于模式中

如何检查 zsh 脚本的参数是否处于模式中

运行的 zsh 脚本:script.zsh nameabc01script.zsh我需要检查是否nameabc01处于此模式中na*abc*,或者不继续执行某些操作或决定退出脚本。

我们怎样才能做到这一点?

为了扩展这个问题,我们如何通过检查文件中的模式列表(以换行符分隔)来实现这一点?

答案1

测试是否有参数以及第一个参数是否匹配某些 glob 模式:

#!/usr/bin/env zsh
if (( # == 0 )); then
   print >&2 "Usage: $0 na*abc* ..."
   exit 1
fi
if [[ $1 != na*abc* ]]; then
   print >&2 "not ok"
   exit 1
fi

(是的,我将 shell 脚本缩进三个空格,但我从来没有在它们上添加*.zsh*.sh扩展)可以测试:

% ./argchecker
Usage: ./argchecker na*abc* ...
% ./argchecker wombat
not ok
% ./argchecker na1abc1
% ./argchecker na1111111111abc1111111111
% 

如果您想允许na1abc1但不允许,na1111111111abc1111111111您将需要使用?代替*或改为切换到正则表达式匹配=~和合适的正则表达式。

从文件中读取模式列表也是可能的,但需要更多的代码来实现必要的逻辑。

#!/usr/bin/env zsh
if (( # == 0 )); then
   print >&2 "Usage: $0 todofixme ..."
   exit 1
fi
globs=(${(f)"$(< patternfile)"})
ret=1
for g in $globs; do
    if [[ $1 == $~g ]]; then
       ret=0
       break
    fi
done
if (( ret == 1 )); then
   print >&2 "not ok"
   exit 1
fi

还有patternfile一些测试。

% cat patternfile
cat*
*bat
% ./pargchecker fish
not ok
% ./pargchecker catfish
% ./pargchecker wombat
% 

zshexpn(1)和中的文档zshparam(1)可能可以浏览一下,或者$fpath[-1]目录中的现有代码。

相关内容