bash - 为什么在'if'语句中'then'必须在bash的下一行?
问题描述
if
后面是then
bash 但我不明白为什么then
不能在同一行中使用它,就像if [...] then
它必须在下一行中使用一样。这是否消除了代码中的一些歧义?还是 bash 是这样设计的?它的根本原因是什么?
我试图写if
在then
同一行,但它给出了以下错误:
./test: line 6: syntax error near unexpected token \`fi'
./test: line 6: \`fi'
代码是:
#!/bin/bash
if [ $1 -gt 0 ] then
echo "$1 is positive"
fi
解决方案
它必须以某种描述的分隔符开头,不一定在下一行(a)上。换句话说,要实现你想要的,你可以简单地使用:
if [[ $1 -gt 0 ]] ; then
echo "$1 is positive"
fi
顺便说一句,对于这样的单行,我倾向于:
[[ $1 -gt 0 ]] && echo "$1 is positive"
但这仅仅是因为我更喜欢在屏幕上看到尽可能多的代码。它实际上只是一种你可以随意忽略的风格。
(a)可以在Bash
手册页中找到原因(我的重点):
保留字:保留字是对外壳有特殊含义的字。以下字在不加引号时被识别为保留字,并且是简单命令的第一个字(参见下面的 SHELL GRAMMAR)或
case
orfor
命令的第三个字:
! case coproc do done elif else esac fi for function if in select then until while { } time [[ ]]
请注意,尽管该部分声明它是“简单命令的第一个单词”,但手册页在引用的部分中似乎自相矛盾SHELL GRAMMAR
:
一个简单的命令是一系列可选的变量赋值,后跟空格分隔的单词和重定向,并由控制操作符终止。第一个字指定要执行的命令,并作为参数零传递。
因此,无论您将其视为下一个命令的一部分还是某种分隔符,都是值得商榷的。无可争辩的是,它需要then
在关键字之前使用某种分隔符(例如换行符或分号) 。
手册页没有说明为什么要这样设计,但可能是为了使命令的解析更简单一些。
推荐阅读
- javascript - 从子组件更改父状态不起作用
- ruby - 使用 Ruby 连接到 Coinbase API 并遇到连接问题。法拉第
- javascript - 如何使用jQuery向HTML字符串(带有嵌套标签)添加'checked'属性,然后返回整个字符串?
- javascript - 使用 Plot.ly javascript 删除组条形图中的空白条形空间?
- javascript - 一个简单的事件没有触发
- php - CPanel 请求的 URL / 在此服务器上未找到
- wso2 - entgraiot 服务器支持的 iOS 版本
- algorithm - 如何使用交叉验证方法制作决策树?
- flutter - 我的代码中有此错误,我正在尝试使用 firebase、email_authentication 创建登录页面
- javascript - 如何在 PrimeNG 表中使用多选过滤器。?