我在运行一个简单的脚本时遇到了麻烦,如果没有新的case语句,它可以正常工作。我想要的是我的脚本能够“捕获”用户“偶然地”在命令行中作为参数输入的特殊字符,并输出错误消息。到目前为止,我的情况如下:
foo1 = foo.strip()
答案 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
命令字符串。在不了解文件格式以及您要使用的格式的情况下,很难提出好的建议,但是我确信有更好的方法。