先回答一些疑问
if [ "$USER" = "root" ]
then
echo "You are root!"
fi
熟悉 C 语言的同学都知道在 C 的语法中条件语句长这样:if … 而在 shell 语法中条件语句长这样:if … then … fi
为什么在 shell 语法中,会多出来个 then?再者,多个 fi?
其实 fi 很好理解:标志着当前 if 语句的结束,就类似 C 语言中的
{}
,方便语法解析器理解语句的结束点,对于 then,我们来看一个例子if command1; command2; command3; then echo "All commands succeeded" else echo "At least one command failed" fi
example:
if echo 'list current file';ls; cd ~; then fi
是不是能理解一些语法设计者的用意了?只不过我们日常编程 if 后只跟了一条命令,显得 then 这个关键词很多余
if [ ]
解释
在 Shell 脚本中,条件表达式通常放在方括号 []
中。为了使条件表达式被正确解析,方括号的前后必须有空格。这是因为 Shell 需要通过空格来区分条件表达式的各个部分,并识别方括号作为命令的一部分。
示例和解释
正确的写法
if [ "$answer" != "${answer#[Yy]}" ]; then
echo "Answer starts with Y or y"
fi
在这个例子中:
[ "$answer" != "${answer#[Yy]}" ]
是条件表达式。[
和]
前后都有空格,这使得 Shell 能够正确地解析条件表达式。
不正确的写法
if ["$answer" != "${answer#[Yy]}"]; then
echo "Answer starts with Y or y"
fi
在这个例子中:
[
和条件表达式之间没有空格,Shell 会把整个["$answer"
视为一个单独的命令,从而导致语法错误。- 同样,
"${answer#[Yy]}"]
也会被视为一个错误的命令。
详细解释
在 Shell 中,方括号 [
实际上是一个命令的简写形式,这个命令是 test
。它的作用是对给定的条件进行评估。如果条件为真,它会返回状态码 0;否则返回非零状态码。
- 当我们写
[ condition ]
时,Shell 实际上是运行test condition
。 - 因为
[
是一个命令,它需要空格来分隔命令和参数。 ]
则是[
命令的结束标志,也需要与条件表达式分隔开来。
示例比较
正确示例
# 示例1:检查文件是否存在
if [ -e /path/to/file ]; then
echo "File exists"
fi
# 示例2:字符串比较
if [ "$answer" != "${answer#[Yy]}" ]; then
echo "Answer starts with Y or y"
fi
# 示例3:整数比较
number=10
if [ "$number" -gt 5 ]; then
echo "Number is greater than 5"
fi
错误示例
# 示例1:缺少空格
if [-e /path/to/file]; then
echo "File exists"
fi
# 示例2:缺少空格
if ["$answer" != "${answer#[Yy]}"]; then
echo "Answer starts with Y or y"
fi
# 示例3:缺少空格
number=10
if ["$number" -gt 5]; then
echo "Number is greater than 5"
fi
在错误示例中,由于缺少空格,Shell 无法正确识别条件表达式,从而导致语法错误。
总结
在编写 Shell 脚本中的条件表达式时,确保在方括号 [
和 ]
的前后留有空格。这是保证 Shell 能够正确解析和执行条件表达式的必要语法规则。