if语句中的嵌套case语句

时间:2018-07-15 17:29:34

标签: bash unix if-statement case

我在运行一个简单的脚本时遇到了麻烦,如果没有新的case语句,它可以正常工作。我想要的是我的脚本能够“捕获”用户“偶然地”在命令行中作为参数输入的特殊字符,并输出错误消息。到目前为止,我的情况如下:

foo1 = foo.strip()

1 个答案:

答案 0 :(得分:2)

当前的问题是字符类表达式[!@#$%^&*()-_=+{}\|;:'",<>?/]包含许多需要转义的字符(至少在bash中,其他shell可能不同),并且-被视为指示字符范围,除非它位于表达式的开头或结尾。这似乎对我有用:[-!@#$%^\&*\(\)_=+{}\|\;:\'\",\<\>?/\\],但我不建议这样做。相反,我建议使用取反字符表示的允许字符,例如[^[:alnum:].][^a-zA-Z0-9.](即,除了字母,数字或句点以外的任何 字符)。

第二个问题:模式仅与单个不受支持的字符匹配,而不与包含的字符串不支持。所以您实际上想要*[^[:alnum:].]*

第三个问题:您试图在case语句(即if)中直接使用if case...,这在技术上是合法的,但可能并不意味着您想要的。只需关闭if部分,并使用*模式作为else情况:

case $1 in
  *[^[:alnum:].]* )
    echo "One or more characters not supported."
    echo "Please try again."
    ;;
  * )
    echo "$1 cannot be found."
    ;;
 esac

其他一些潜在的问题:您有许多未加引号的变量引用(例如if [ -f $1 ]),如果变量中有任何有趣的字符,可能会引起麻烦;这些几乎应该始终用双引号引起来(例如if [ -f "$1" ])。您还在 之后检查不支持的字符以查找文件;如果文件名中包含不受支持的字符,该脚本应该继续运行并还是拒绝并投诉?请注意,Unix文件名中几乎所有合法的内容。

最后,正如RavinderSingh13在评论中所说,不需要使用这么长的sed命令字符串。在不了解文件格式以及您要使用的格式的情况下,很难提出好的建议,但是我确信有更好的方法。