如何否定案例模式

如何否定案例模式

如何添加 我添加条件,如果它没有检测到所需的条件,它将执行该命令。

我的代码:

case $price in
[0-9] | "." | "$") echo "Numbers, . , $ Only"
            ;;
esac

如果检测到数字“.”,则执行此命令。和“$”。如果没有检测到这些,在某种意义上如何改变它,命令将执行。或者还有其他更好的命令可以用来执行此功能。

答案1

添加默认情况:

case $price in
[0-9] | "." | "$") true
            ;;
*) 
   do-something
   ;;
esac

答案2

这个答案不是指已经解释过的case问题,而是指匹配问题。

首先我们需要定义有效字符串的样子。当然,最简单的定义只允许一种结构,例如

  1. 以一位或多位数字开头(允许有前导零)
  2. 小数点
  3. 两位尾随数字(如果需要00
  4. 美元符号(无前导空格)

作为正则表达式(例如grep,请参阅man 7 regex),这将写为:

^[0-9]+\.[0-9][0-9]\$$
  • ^标记字符串的开头,即前面不能有任何内容[0-9]+
  • 点被转义\.以便被视为文字点
  • 美元符号被转义\$以便被视为字面意思
  • 尾随$标记字符串的结尾,即文字后面不能有任何内容$

测试:

> echo '0123.45$' | grep -E '^[0-9]+\.[0-9][0-9]\$$'
0123.45$

如果更改定义,使得带有尾随数字的点和美元符号都是可选的,则正则表达式将更改为

^[0-9]+(\.[0-9][0-9])?\$?$

测试:

> echo '0123$' | grep -E '^[0-9]+\.[0-9][0-9]\$$'

# no match
> echo '0123$' | grep -E '^[0-9]+(\.[0-9][0-9])?\$?$'
0123$
> echo '0123.45$' | grep -E '^[0-9]+(\.[0-9][0-9])?\$?$'
0123.45$

shell 可以直接使用正则表达式,但不能在case模式内使用。你需要[[ ]]结构。但由于您只想知道字符串是否匹配,因此没有理由使用case

if [[ "$price" =~ ^[0-9]+(\.[0-9][0-9])?\$?$ ]]; then
  :
else
  :
fi

如果您确实需要,则可以使用 shell bulitincase设置选项并将正则表达式重写为“shell regex”:extglobshopt

shopt -s extglob

^[0-9]+(\.[0-9][0-9])?\$?$那么就变成

+([0-9])?(.[0-9][0-9])?($)

领先$

如果你想要$0123.45而不是那么你显然必须在开始时0123.45$进行检查:$

  • grep/ [[ ]]^\$?[0-9]+(\.[0-9][0-9])?$
  • 外壳模式匹配:?($)+([0-9])?(.[0-9][0-9])

更容易检查

如果您不关心顺序而只关心正确的字符,那么您可以使用更简单的表达式:

  • grep/ [[ ]]^[0-9.$]+$
  • 外壳模式匹配:+([0-9.$])

例子

#! /bin/bash

shopt -s extglob

for value in 1234 1234EUR; do
    case "$value" in
            +([0-9]))
                    echo "value OK: '${value}'"
            ;;
            *)
                    echo "value not OK: '${value}'"
            ;;
    esac
done

答案3

要将仅包含单个正整数的字符串与 shellcase语句匹配,您可以执行以下操作:

case "${string:--}" in
(*[!0-9]*)  
! echo 'Invalid value for $string!';;
(*[!0]*) 
echo "$string is a positive integer greater than 0.";;
(*)
echo "$string is 0.";;
esac

在第一个case匹配中,我会筛选包含${string:--}不在 之中的任何扩展值,甚至包含单个字符0123456789。如果$string未设置或为空,它将扩展为-并因此仍然匹配此模式。领先!反转echo的回归(始终为 0)到 1 - 因此如果包含无效值,则case构造返回 1 。$string

接下来,我将匹配$string包含非 0 的单个数字的任何值 - 因此任何有效值上的任何数量的前导 0$string都将匹配为正数。

最后一个匹配与前两个不匹配的任何内容 - 也就是说它仅匹配一个或多个 0。

相关内容