我目前正在研究shell脚本并遇到一些语法问题。
我正在使用的是'if'语句来捕获任何带字母的用户输入,除了“giveup”行
这是我构建的代码:
if [ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ]
一旦我运行代码,它会发出错误消息,说明:
[: missing `]'
如果你们有任何解决方案,我很乐意听取你的建议:)
谢谢!
答案 0 :(得分:2)
test
([
)不支持放置条件构造,例如&&
,||
或多个命令分隔符,例如其中;
。
此外,[
不支持与=~
匹配的正则表达式。顺便说一句你的正则表达式模式不正确,它看起来更像是一个glob模式(在这种情况下应该就足够了)。
[[
bash
关键字支持上述两种情况,并非所有shell都支持这些。
所以,你可以这样做:
if [[ $usrGuess = *[[:alpha:]]* && $usrGuess != "giveup" ]]
在这里,我移动了[[
并使用了Glob匹配$usrGuess = *[:alpha:]*
(删除了正则表达式匹配)。
答案 1 :(得分:0)
使用双括号,因为条件是复合的:
if [[ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ]]
答案 2 :(得分:0)
使用grep
命令稍微不同的方法也可以。
if grep -v '^giveup$' <<<$userGuess | grep -iq '^[a-z]*$'
在这个例子中,我们使用grep命令的退出代码来做出if-else决定。另请注意&#39; -q&#39;第二个grep命令的选项。这可确保grep命令以静默方式匹配模式。
优点:不太复杂的if()子句。
Con:执行了两个grep
进程。
答案 3 :(得分:0)
如果您确实希望保留POSIX兼容性,请使用expr
命令执行正则表达式匹配。
if expr "$usrGuess" : '[[:alpha:]]*' > /dev/null && [ "$usrGuess" != "giveup" ]
无论哪种方式,我都会先选择反对“放弃”;如果检查失败,则完全避免使用更昂贵的正则表达式检查。