for循环
格式:
for VAR in LIST; do
STATEMENT1
...
Done
VAR:变量名
LIST:列表 可直接给出 如:{1 2 3 4 }
或者{start..end} 如:{1..10}
或者$@ 列出向脚本传递的位置变量
或者使用命令引用 如 `seq 1 2 9` 起始值为1 步长为2 最大为9 的值
举例:输出1-10十个数字
C风格格式:
for (( 变量赋值;循环条件;修正表达式 ));do
STATEMENT1
...
done
举例:输出1-10中的偶数
条件测试
格式: test Expression
或[ Expression ]
或` Expression `
或 COMMAND 命令的退出状态码,命令执行成功结果为真否则为假
Expression:测试表达式 可以是整数测试、字符串测试、文件测试等。
整数测试:
符号 | 用法 | 含义(英文注释) | 结果 |
-gt | A–gt B | Agreat than B | A大于B则为真否则为假 |
-ge | A–ge B | Agreat than or equal B | A大于等于B则为真否则为假 |
-eq | A –eqB | Aequal B | A等于B则为真否则为假 |
-lt | A–lt B | Aless than B | A小于B则为真否则为假 |
-le | A–le B | Aless than or equal B | A小于等于B则为真否则为假 |
-ne | A–ne B | Anot equal B | A不等于B则为真否则为假 |
字符串测试:
符号 | 用法 | 结果 |
> | A>B | A大于B则为真否则为假 |
< | A<B | A小于B则为真否则为假 |
=或== | A=B或A==B | A等于B则为真否则为假 |
>= | A>=B | A大于等于B则为真否则为假 |
<= | A<=B | A小于等于B则为真否则为假 |
!= | A!=B | A不等于B则为真否则为假 |
=~ | “$A”=~ PATTERN | 变量A字串能与PATTERN匹配则为真否则为假 |
-z | -zA | 判断A是否为空,空为真,不空为假 |
-n | -nA | 判断A是否非空,非空为真,空为假 |
<= | A<=B | A小于等于B则为真否则为假 |
文件测试:
-e/path/to/somefile | 判断某文件是否存在,存在为真,否则为假 |
-f/path/to/somefile | 判断文件存在且为普通文件则为真,否则为假 |
-d/path/to/somefile | 判断文件存在且为目录文件则为真,否则为假 |
-h /path/to/somefile | 判断文件存在且为符号链接文件则为真,否则为假 |
-b/path/to/somefile | 判断文件存在且为块设备文件则为真,否则为假 |
-c/path/to/somefile | 判断文件存在且为字符设备文件则为真,否则为假 |
-S/path/to/somefile | 判断文件存在且为套接字文件则为真,否则为假 |
-P/path/to/somefile | 判断文件存在且为管道文件则为真,否则为假 |
-r/path/to/somefile | 判断当前用户对此文件有读权限有则为真,否则为假 |
-w/path/to/somefile | 判断当前用户对此文件有写权限有则为真,否则为假 |
-x/path/to/somefile | 判断当前用户对此文件有执行权限有则为真,否则为假 |
-u/path/to/somefile | 判断文件是否拥有suid权限有则为真,否则为假 |
-g/path/to/somefile | 判断文件是否拥有sgid权限有则为真,否则为假 |
-k/path/to/somefile | 判断文件是否拥有sticky权限有则为真,否则为假 |
-O/path/to/somefile | 判断当前用户是否为文件的属主是则为真,否则为假 |
-G/path/to/somefile | 判断当前用户是否属于文件的属组属于则为真,否则为假 |
-N/path/to/somefile | 判断文件自从上一次被读取之后,是否被修改过,修改过为真,否则为假 |
file1-nt file2 | 文件f1是否比文件f2新是则为真,否则为假 |
file1-ot file2 | 文件f1是否比文件f2旧是则为真,否则为假 |
file1-ef file2 | f1和f2是否为同一文件的硬链接是则为真否则为假 |
If语句
格式:
单分支:
ifCONDITION-TRUE; then
分支
fi
双分支:
ifCONDITION-TRUE; then
分支1
else
分支2
fi
多分支:
if CONDITION1-TRUE; then
分支1
elifCONDITION2-TRUE; then
分支2
...
else
分支n
fi
举例:写一个脚本
(1) 传递一个参数给脚本,此参数为用户名;
(2) 如果用户存在,则执行如下任务
(a) 如果用户的id号小于500,显示其为管理员或系统用户;
(b) 否则,显示其为普通用户;
(3) 如果用户不存在,则添加之;
case语句
格式:
case变量引用 in
PATTERN1)
分支1
;;
PATTERN2)
分支2
;;
...
*)
分支n
;;
Esac
PATTERN可使用通配符:
*:任意长度的任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或者b
交互式脚本
read [OPTIONS] [name ...]
-p"PROMPT"
-t #: 超时时长
给变量以默认值:
[ -z"$VAR" ] && VAR=VALUE
举例:显示如下菜单给用户
cpu) show cpuinfomation;
mem) show memoryinfomation;
disk) show diskinfomation;
*) quit
提示用户键入选项:
(1) cpu: 显示CPU相关的信息
(2) mem: 显示内存相关的信息
(3) disk: 列出磁盘设备
(4) 其它任何信息,即为退出脚本
while循环
格式:
while CONDITION; do
循环体
循环控制变量的修正表达式
done
当CONDITION为“真”进入循环,直到“假”退出循环;
举例:计算100以内所有偶数之和
until循环
格式:
until CONDITION; do
循环体
循环控制变量修正表达式
done
当CONDITION为“假”时进入循环;为“真”退出循环;
循环控制命令
break:提前退出循环;
break[N]: 退出N层循环;N省略时表示退出break语句所在的循环;
continue:提前结束本轮循环,而直接进入下轮循环;
continue[N]:提前第N层的循环的本轮循环,而直接进入下轮循环;
举例:写一个脚本,判断给定的用户是否登录了当前系统;
(1)如果登录了,则脚本终止;
(2)每5秒种,查看一次用户是否登录;