如何添加 我添加条件,如果它没有检测到所需的条件,它将执行该命令。
我的代码:
case $price in
[0-9] | "." | "$") echo "Numbers, . , $ Only"
;;
esac
如果检测到数字“.”,则执行此命令。和“$”。如果没有检测到这些,在某种意义上如何改变它,命令将执行。或者还有其他更好的命令可以用来执行此功能。
答案1
添加默认情况:
case $price in
[0-9] | "." | "$") true
;;
*)
do-something
;;
esac
答案2
这个答案不是指已经解释过的case
问题,而是指匹配问题。
首先我们需要定义有效字符串的样子。当然,最简单的定义只允许一种结构,例如
- 以一位或多位数字开头(允许有前导零)
- 小数点
- 两位尾随数字(如果需要
00
) - 美元符号(无前导空格)
作为正则表达式(例如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”:extglob
shopt
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。