Как проверить параметр zsh-скрипта в шаблоне или нет?

Скрипт zsh, который запускается: script.zsh nameabc01 , в script.zsh Мне нужно проверить, есть ли nameabc01 в этом шаблоне, na*abc* или нет, чтобы продолжить что-то делать или решить выйти из скрипта.

Как мы можем этого достичь?

и чтобы расширить этот вопрос, как мы можем добиться этого, сверяясь со списком шаблонов в файле (разделенных новой строкой)?

Проверьте, что есть аргументы и что первый аргумент соответствует некоторому шаблону 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 

(Да, я вставляю скрипты оболочки в три пробела, и нет, я никогда не *.zsh в них расширения *.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) , вероятно, работают в режиме peek или существующего кода в $fpath[-1] .