Shell执行控制
符号
命令执行
;:连续执行指令,分割多条命令- 所以如果不是在一行内执行,
;是可以有任意多个
- 所以如果不是在一行内执行,
::内建空指令,返回值为0&&, ||:逻辑与、或,全部(任意)之前的命令执行成功才会 执行下连接中的命令
“转义”
\\:转义字符- 放在指令前,取消
alias - 特殊符号前转义,Shell将不对其后字符作特殊处理,当作
普通字符(即
$, \', \") - 行尾表示连接下一行,回车符只起换行作用,视为空格
- 放在指令前,取消
$:变量符号,表示其后字符串为一个变量\', \":内部视为字符串--:命令行中转义-,否则shell认为-是参数选项1
2rm -- -file
删除文件`-file`- 还可以在之前加上路径避免
-被解释为参数选项 \、''等均无效
- 还可以在之前加上路径避免
引号
单引号''
单引号括起字符都作为普通字符,变量无效
单引号字串中不能出现单独的单引号,使用转义符也不行,但是 可以成对出现,作为字符串拼接使用
双引号""
- 双引号字串中可以有变量、转义字符
反引号``
反引号扩起字符串表示Shell解释命令,执行时shell首先解释其, 以标准输出替代整个反引号
括号中语句为命令,分号连接
``中的表达式只需要符合C语言的运算规则 即可,甚至可以使用三目预算符、逻辑表达式
命令和括号之间无空格
$``可以将命令输出作为变量返回值,同$()
括号
()
命令组/运算表达式:其中的命令列表将在新子shell运行
- 其中变量之后不能使用,不影响当前shell环境
- 多个命令之间分号分隔,最后命令可以省略
- 命令和括号之间可以无空格
命令替换:等同于引号
``- bash扫描命令行,执行
$()结构中命令,将标准输出作为 匿名变量值 ()中出现()不需要转义,``需要转义()中不能使用C风格的运算表达式
- 部分shell可能不支持
(),如:tcsh
- bash扫描命令行,执行
初始化数组:参见数组
(())
整数扩展:计算、扩展算数表达式结果
- 表达式结果为0则退出状态为1、false
- 表达式结果为1则退出状态为0、true
1
2a=5;((a++)) # 自增运算符
b=$((16#5f)) # 进制转换- 退出状态和
[]完全相反 - 其中可使用任何符合C语言的运算,包括三目运算符
算术比较:
- 其中变量可以不使用
$前缀、支持多个表达式逗号分隔 - 可直接使用C风格表达式,如:
for、while循环语句中
- 其中变量可以不使用
1
2
3
4
5
6
7
for((i=0;i<5;i++))
for i in `seq 0 4`
for i iin {0..4}
三者等价
if ((i<5))
if [ $i -lt 5 ]
二者等价
[]、[[]]
[]- 条件测试表达式:参见
if - 数组索引
- 正则表达式范围
- 条件测试表达式:参见
[[]]- 条件测试表达式:参见
if
- 条件测试表达式:参见
{}
创建匿名函数
- 不开启新进程
- 括号内变量之后可继续使用
- 括号内命令分号分隔,最后一个语句也要有分号
{和第一个语句之间要有空格
字符串
- 默认值替换:参见字符串默认值替换
- 获取子串:参见字符串子串
- 获取切片:参见字符串子串
- 字符串替换:参见字符串子串
$后包括变量名精确分隔变量名,参见变量使用
其他符号
!
Shell中!称为事件提示符,可以方便的引用历史命令:当!
后跟随字母不是空格、换行、回车、=、(时,做命令替换
![-]n:引用history中的正数/倒数第n个命令!!:等同!-1,执行上条命令
!cmd:引用最近以cmd开头的命令,包括参数!cmd:gs/pattern/replace:将上条cmd开头命令中pattern替换为replace
!?str[?]:引用最近包含str的命令,str可以是参数参数引用
!$:最后一个参数!:-:除最后一个参数!*:所有参数
控制语句
if、[]
用于条件控制结构,结构如下
1 | if test_expression; then |
test <expr>:bash内部命令,判断表达式是否为真- 其后只能有一个表达式判断,无法使用逻辑与、或连接
[ <expr> ]:基本等同于test- 整数比较:
-ne、-eq、-gt、-lt - 字符串比较:转义形式大、小号
\<、/> - 逻辑表达式连接:
-o(或)、-a(与)、!(非) (不能使用||(或)、&&(与))
1
2
3if [ $? == 0 ]
if test $? == 0
二者等价- 注意内部两边要有空格
- 事实上是
[等同于test,]表示关闭条件判断,新版 bash强制要求闭合
- 整数比较:
[[ <expr> ]]条件测试- 整数比较:
!=、=、<、> - 字符串:支持模式匹配(此时右侧模式时不能加引号)
- 逻辑表示式连接:
||(或)、&&(与)、!(非)
1
2
3
4if [[ $a != 0 && $b == 1 ]]
if [ $a -eq 0 ] && [ $b -eq 1]
if [ $a -eq 0 -a $b -eq 1]
三者等价[[:bash关键字,bash将其视为单独元素并返回退出 状态码
- 整数比较:
case
1 | case chars in |
while
1 | while test_expression |
until
1 | until test_exprssion |
for
CStyle
1 | for ((i=0; i<limit; i++)) |
ListStyle
1 | for var in var_arr |
FileIterator
1 | for var in /path/to/file_regex |
/path/to/file_regex注意- 路径不存在:
$var为该字符串 - 不能用
""括起,否则:$var只取路径下所有匹配合并 ,空格分隔
- 路径不存在:
ParamsIterator
1 | for var[ in $*] |
RangeIterator
1 | for i in $(seq start end) |
break, continue, exit
break[n]:跳出n层循环体,默认跳出一层循环体continue[n]:跳过n层循环体在其之后的语句,回到循环开头 ,默认跳过一次循环体exit:退出程序,后跟返回值

