if [ expression ] then statements elif [ expression ] then statements elif … else statements fi
紧凑形式
;
同一行上多个命令分隔符
3.2.2. case语句
形式
分支语句结尾是;;
1 2 3 4 5
case str in str1 | str2) statements;; str3 | str4) statements;; *) statements;; esac
例子:
1 2 3 4 5 6 7 8 9
#!/bin/sh echo "Is this morning? Please answer yes or no." read answer case "$answer" in yes | y | Yes | YES) echo “Good morning!” ;; no | n | No | NO) echo “Good afternoon!” ;; *) echo “Sorry, answer not recognized.” ;; esac exit 0
4. 循环语句
语句开始和结束都是do和done
4.1. for语句
形式
1 2 3 4
for var in list do statements done
适用于对一系列字符串循环处理。
例子
1 2 3 4
for file in $(ls f*.sh);do lpr $file done exit 0
$()相当于反引号,执行里面的命令把结果字符串替换在这里
4.2. while语句
形式
1 2 3 4
while condition do statements done
例子
1 2 3 4 5 6 7 8 9 10 11
quit=n while [ "$quit" != "y" ]; do read menu_choice case "$menu_choice" in a) do_something;; b) do_anotherthing;; … q|Q) quit=y;; *) echo "Sorry, choice not recognized.";; esac done
4.3. until语句
不推荐使用
形式
条件为假时执行循环
1 2 3 4
until condition do statements done
4.4. select语句
形式
1 2 3 4
select item in itemlist do statements done
作用
直接生成菜单列表
1 2 3 4 5 6 7 8 9 10
#!/bin/sh clear select item in Continue Finish do case "$item" in Continue) ;; Finish) break ;; *) echo “Wrong choice! Please select again!” ;; esac done
break跳出的是select循环
5. 命令表和语句块
5.1. 命令表/命令组合
分号串联
把多个命令放在同一行
command1;command2;…
条件组合
AND命令表
前面成功了,后面才会继续执行。
statement1 && statement2 && statement3 && …
OR命令表
前面的失败了,采取执行后面的;前面成功了后面就不执行。只有一个命令会成功执行。
statement1 || statement2 || statement3 || …
5.2. 语句块
形式
1 2 3 4 5
{ statement1 statement2 ... }
6. 函数
形式
1 2 3 4
func() { statements }
局部变量
local关键字
默认全局变量
函数调用
func para1 para2 …
返回值
return
参数
没有形参
在函数内用2,…调用
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
yesno() { msg=“$1” def=“$2” while true; do echo "" echo "$msg" read answer if [ -n "$answer" ]; then ... else return $def fi done }
7. 杂项命令
break: 从for/while/until/select循环退出
continue: 跳到下一个循环继续执行
exit n: 以退出码”n”退出脚本运行
return: 函数返回
export: 将变量导出到shell,使之成为shell的环境变量
该进程及其子进程都有效,否则只在脚本有效
set: 为shell设置参数变量
unset: 从环境中删除变量或函数
trap: 指定在收到操作系统信号后执行的动作
“:”(冒号命令): 空命令
“.”(句点命令)或source: 在当前shell中执行命令
8. 捕获命令输出
语法
$(command)
反引号
1 2
echo “The current directory is $PWD” echo “The current directory is $(pwd)”
9. 算术扩展
$((…))
在Shell脚本里比较慢
1 2 3 4 5 6 7 8
#!/bin/sh x=0 while [ "$x" –ne 10 ]; do echo $x x=$(($x+1)) done exit 0
10. 参数扩展
替换字符串
例子
批处理1_tmp,2_tmp,…
1 2 3 4 5 6 7
#!/bin/sh i=1 while [ "$i" –ne 10 ]; do touch "${i}_tmp" i=$(($i+1)) done exit 0
去掉扩展名
${param%.*},这里*是通配符,不是正则表达式
${param%.cpp},只去掉.cpp扩展名
${param%.cpp}.o,只去掉.cpp扩展名,扩展名变成.o
11. 即时文档
在shell脚本中向一条命令传送输入数据
1
<<
1 2 3 4 5
#!/bin/bash
cat >> file.txt << !CATINPUT! Hello, this is a here document. !CATINPUT!