【Shell】流程控制
目录
- if else
- if
- if else
- if else-if else
- case ... esac
和 Java、PHP 等语言不一样,sh 的流程控制不可为空,如(以下为 PHP 流程控制写法):
<?php
if (isset($_GET["q"])) {search(q);
}
else {// 不做任何事情
}
在 sh/bash 里可不能这么写,如果 else 分支没有语句执行,就不要写这个 else。
if else
if
if 语句语法格式
if condition
thencommand1 command2...commandN
fi
写成一行(适用于终端命令提示符):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
末尾的 fi 就是 if 倒过来拼写,后面还会遇到类似的。
if else
if else 语法格式:
if condition
thencommand1 command2...commandN
elsecommand
fi
if else-if else
if else-if else 语法格式:
if condition1
thencommand1
elif condition2
then command2
elsecommandN
fi
if else 的 […] 判断语句中大于使用 -gt,小于使用 -lt。
if [ "$a" -gt "$b" ]; then...
fi
if 后面必须跟空格,(if 后有空格,[ 是命令,后面也需要空格)。
[ 后、] 前,以及变量和运算符之间必须有空格。

如果使用 ((…)) 作为判断语句,大于和小于可以直接使用 > 和 <。
if (( a > b )); then...
fi

case … esac
case … esac 为多选择语句,与其他语言中的switch ... case 语句类似,是一种多分支选择结构,每个case分支用右圆括号开始,用两个分号;;表示break,即执行结束,跳出整个case ... esac语句,esac作为结束标记。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
语法格式如下
case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac
case工作方式如上,取值后面必须为单词in,每一模式必须以右括号结束,取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至;;
取值将检测匹配的每一个模式,一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式,如果无一匹配模式,使用星号*捕获该值,再执行后面的命令

