首页 > 解决方案 > 为什么在'if'语句中'then'必须在bash的下一行?

问题描述

if后面是thenbash 但我不明白为什么then不能在同一行中使用它,就像if [...] then它必须在下一行中使用一样。这是否消除了代码中的一些歧义?还是 bash 是这样设计的?它的根本原因是什么?

我试图写ifthen同一行,但它给出了以下错误:

./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

标签: bashif-statement

解决方案


它必须以某种描述的分隔符开头,不一定在下一行(a)上。换句话说,要实现你想要的,你可以简单地使用:

if [[ $1 -gt 0 ]] ; then
    echo "$1 is positive"
fi

顺便说一句,对于这样的单行,我倾向于:

[[ $1 -gt 0 ]] && echo "$1 is positive"

但这仅仅是因为我更喜欢在屏幕上看到尽可能多的代码。它实际上只是一种你可以随意忽略的风格。


(a)可以在Bash手册页中找到原因(我的重点):

保留字:保留字是对外壳有特殊含义的字。以下字在不加引号时被识别为保留字,并且是简单命令的第一个字(参见下面的 SHELL GRAMMAR)或caseorfor命令的第三个字:

! case coproc do done elif else esac fi for function if in select then until while { } time [[ ]]

请注意,尽管该部分声明它是“简单命令的第一个单词”,但手册页在引用的部分中似乎自相矛盾SHELL GRAMMAR

一个简单的命令是一系列可选的变量赋值,后跟空格分隔的单词和重定向,并由控制操作符终止。第一个字指定要执行的命令,并作为参数零传递。

因此,无论您将其视为下一个命令的一部分还是某种分隔符,都是值得商榷的。无可争辩的是,它需要then在关键字之前使用某种分隔符(例如换行符或分号) 。

手册页没有说明为什么要这样设计,但可能是为了使命令的解析更简单一些。


推荐阅读