运行的 zsh 脚本:script.zsh nameabc01
,script.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]
目录中的现有代码。