提问人:swgeek 提问时间:8/18/2023 最后编辑:Silvio Mayoloswgeek 更新时间:10/1/2023 访问量:85
bash if-elif-else 序列 get “第一个 elif 上预期的条件二进制运算符
bash if-elif-else sequence get "conditional binary operator expected on first elif
问:
学习/重新学习 bash 脚本。以下 if - elif 语句在第一个 elif 上出现条件二进制运算符错误:
if [ $len -eq 1 ]; then
grep -i -H $1 *.org
elif [[ [ $len -eq 2 ] -a { [ $1 == "keyword" ] -o [ $1 == "todo" ] } ]]; then
是的,我是一个老菜鸟,我被难住了。在我看来还可以。 swgeek
更正了一些间距错误,尝试使用括号,在此处使用条件二进制运算符进行搜索,并将继续搜索,但距离不远,灯泡无法继续亮起。
答:
2赞
Barmar
8/18/2023
#1
里面所有额外的包围都是无效的。它应该是[[ ... ]]
elif [[ $len -eq 2 && ( $1 == "keyword" || $1 == "todo" ) ]]; then
在方括号内,使用括号进行分组,而不是方括号或大括号。它使用 C 样式的逻辑运算符。
或者,您可以使用标准的单方括号,但在命令之间使用 and,而不是 and(这些仅在括号内使用)。您还需要在关闭之前。&&
||
-a
-o
;
}
elif [ $len -eq 2 ] && { [ "$1" = "keyword" ] || [ "$1" = "todo" ]; }; then
方括号还允许在一组括号内的表达式之间使用 和 ,但由于这些运算符的歧义,这被认为是过时的,因此最好使用上面的条件语法。-a
-o
评论
0赞
Barmar
8/18/2023
感谢所有的提醒,更新了答案。
0赞
user1934428
8/18/2023
#2
例如,您可以将其写为
elif (( len == 2 )) && [[ $1 =~ ^(keyword|todo)$ ]]
这将使以后以 1 美元的价格添加更多替代品变得容易。
评论
0赞
swgeek
8/21/2023
谢谢帮派,我很好,有你的帮助和建议
0赞
swgeek
8/21/2023
对于第二个答案,我相信你的意思是$len,我假设是错别字。至于其余的,帮助我理解。$1 匹配(模式)关键字或待办事项(如果它们不在“中),我没有得到尾随的 $ - 这个整体问题解决了,现在我要求我自己的理解,并”阅读“bash 脚本。
0赞
user1934428
8/21/2023
@swgeek : 不,我是说普通的。毕竟,我们处于数字环境中。使用 instead 可能具有可能的好处,即如果变量未定义或为空,我们会得到语法错误,而在编写普通变量时,空变量将被解释为零。$1 匹配关键字或待办事项的单词。这只是一个普通的正则表达式匹配,正如您所知道的那样。这意味着,如果你想把它扩展到几个关键词,你只需把它变成 .len
$len
len
len
egrep
^(keyword1|keyword2|....|todo)$
评论
[ ... ]
[[ ... ]]
-o
不是 shell 语法,而是命令的参数。你不能在任何上下文中使用它,除非 where or is 接受参数,即使这样,它也被标记为过时(首选语法是组合多个较小的测试命令)。也是如此。[
test
[
-a