Использование переменной в качестве условия case в zsh

Вы можете использовать seq , чтобы составить полный список, а затем используйте grep , чтобы увидеть, что отсутствует:

#!/bin/bash

list=$1
from=$(head -n1 $list)
to=$(tail -n1 $list)
grep -vwf "$list" <(seq "$from" "$to")
6
31.05.2018, 00:36
1 ответ

С сохранением этого кода в файл first,

pattern=fo*
input=foo
case $input in
$pattern)
   print T
   ;;
fo*)
   print NIL
   ;;
esac

в -xмы можем заметить, что переменная отображается как значение в кавычках, в то время как необработанное выражение не:

% zsh -x first
+first:1> pattern='fo*'
+first:2> input=foo
+first:3> case foo (fo\*)
+first:3> case foo (fo*)
+first:8> print NIL
NIL

То есть переменная обрабатывается как литеральная строка. Если вы проведете достаточно времени в zshexpn(1), вы можете знать о флаге замены glob

   ${~spec}
          Turn on the GLOB_SUBST option for the evaluation of spec; if the
          `~'  is  doubled,  turn  it  off.   When this option is set, the
          string resulting from the expansion will  be  interpreted  as  a
          pattern anywhere that is possible,

поэтому, если мы изменим $pattern, чтобы использовать это

pattern=fo*
input=foo
case $input in
$~pattern)                # !
   print T
   ;;
fo*)
   print NIL
   ;;
esac

вместо этого мы видим

% zsh -x second
+second:1> pattern='fo*'
+second:2> input=foo
+second:3> case foo (fo*)
+second:5> print T
T

для вашего случая шаблон должен быть заключен в кавычки:

pattern='(foo|bar)'
input=foo
case $input in
$~pattern)
   print T
   ;;
*)
   print NIL
   ;;
esac
9
27.01.2020, 20:26

Теги

Похожие вопросы