目录
一、shell 变量
1、export
缺省情况下,只有环境变量 (e.g. HOME, MAIL, PATH, and PWD)对所有的子进程可见。
让变量成为“环境变量”。一、定义变量;二、使用 “export”命令导出。
格式: export [变量名]
也可以简写成一条语句:
export str=“parent shell variable”
不带参数的export命令可以显示本进程的全部环境变量。
在子进程中改变环境变量的值不会影响父进程中该变量的值。
二、控制结构
Bash具有一般高级程序设计语言所具有的条件控制结构、循环控制结构和函数定义与调用功能,如:if, for, while等。
[[ ]]
1、 test命令
文件属性测试
参数 | 功能 |
-d文件名 | 若文件存在并且是目录文件,则测试条件为真 |
-e 文件名 | 若文件存在,则测试条件为真 |
-f 文件名 | 若文件存在并且是普通文件,则测试条件为真 |
-L 文件名 | 若文件存在并且是一个符号连接,则测试条件为真 |
-p文件名 | 若文件存在并且是一个命名管道,则测试条件为真 |
-r文件名 | 若文件存在并且是用户可读的,则测试条件为真 |
-s文件名 | 若文件存在并且文件的长度大于0(即非空),则测试条件为真 |
-w文件名 | 若文件存在并且是用户可写的,则测试条件为真 |
-x文件名 | 若文件存在并且是用户可执行的,则测试条件为真 |
-O 文件名 | 若当前用户是文件的所有者,则测试条件为真 |
-G 文件名 | 若当前用户的组ID匹配文件的组ID,则测试条件为真 |
文件1 –nt 文件2 | 若文件1比文件2新,则测试条件为真 |
文件1 –ot 文件2 | 若文件1比文件2旧,则测试条件为真 |
字符串测试
参数 | 功能 |
-z str | 如果字符串str的长度为0,即空串,则测试条件为真 |
-n str | 如果字符串str的长度大于0,即非空串,则测试条件为真 |
str | 如果字符串str不是空字符串,则测试条件为真 |
sl = s2 | 如果sl等于s2,则测试条件为真,“=”也可以用“==”代替 |
s1 != s2 | 如果s1不等于s2,则测试条件为真 |
s1 \< s2 | 如果按字典顺序s1在s2之前,则测试条件为真 |
s1 \> s2 | 如果按字典顺序s1在s2之后,则测试条件为真 |
数值(整数)测试
参数 | 功能 |
n1 –eq n2 | 如果整数n1等于n2,则测试条件为真 |
n1 –ne n2 | 如果整数n1不等于n2,则测试条件为真 |
n1 –lt n2 | 如果n1小于n2,则测试条件为真 |
n1 –le n2 | 如果n1小于或等于n2,则测试条件为真 |
n1 –gt n2 | 如果n1大于n2,则测试条件为真 |
n1 –ge n2 | 如果n1大于或等于n2,则测试条件为真 |
逻辑测试
用法 | 逻辑 |
[ expr1 –a expr2 ] | 与. |
[ expr1 –o expr2 ] | 或. |
test1 && test2 | 与. |
test2 || test2 | 或. |
[ !expr ] | 非. |
!test | 非. |
\(expr\) | 改变优先级. |
优先级
“()” > “条件测试运算符” > “!” > “-a” > “-o”
2、let命令
3、[[ ]]
同 “[]”, 但特殊字符不需要转义。
在使用 = 或 != 操作符时,复合命令“[[ ]]”可在字符串上进行模式匹配。
4、if语句
语法
if语句唯一可测试的内容是命令退出状态,也就是说,测试条件是一或多条命令。
5、case语句
语法
每个模式字符串后面可有一条或多条命令,其中最后一条命令必须以两个分号(即;;)结束。
case的退出状态(返回值)是整个结构中最后执行的那个命令的退出状态,若没有执行任何命令,则退出状态为零。
模式字符串中可以使用通配符
一个模式字符串中可包含多个模式,各模式之间以竖线(|)隔开,各模式是“或”的关系。
6、while语句
语法
测试条件的使用方式和”if”语句一样。
7、until语句
语法
同 “while”, 但循环在测试条件为真时结束
8、for语句
![](https://img-blog.csdnimg.cn/d2e25af7789a4f8ea452213f88b4a915.png)
循环变量的值依次取自<值表>。
循环变量的值也可取自从“$1”起的所有位置变量。
值表也可以是文件正则表达式
![](https://img-blog.csdnimg.cn/5b5c3927805847ff8cead994f6e72991.png)
与C语言中for语句相似
9、break,continue,exit
break
n为一整数,表示要跳出几层循环,默认值是1
![](https://img-blog.csdnimg.cn/7cb8ef5e12314318924874ac25e5b888.png)
exit
10、select命令
如果省略[in word...],那么参数identifier就以位置参数($1,$2,…)作为给定的值。
三、函数
语法
函数必须先定义后使用。
调用函数时,直接使用函数名,不必带圆括号,就像使用一般命令一样。
调用函数不会创建新的进程,而是在本shell脚本所属的进程内执行。
向函数传递数据须使用位置参数($1,$2等) 。
用local关键字定义只能用于本函数的局部变量。
语法 local var_name
可使用return命令在任意位置退出函数。
语法 return [n]
四、内置命令
1、eval
格式 eval [参数…]
首先扫描参数,所有参数被读取并连接(扩展)成一个字符串,然后eval再将该字符串当成命令来执行。
2、exec
格式 exec [arg…]
在本Shell中执行由参数arg指定的命令,该命令将替代本Shell进程
3、readonly
格式 readonly [name]
标记给定的name(变量名)是只读的,等价于 “declare –r”
4、 trap
格式 trap [arg] [n]
用于捕获信号。
<n> 是要捕获的信号。 <arg>是捕获信号后要执行的命令。
用法
为某些信号另外指定处理方式。
指定arg为空串以忽略信号
不指定arg,把信号的动作恢复成原来系统默认的动作。
5、set
3个功能
显示已定义的全部变量.
设置位置参数的值.
设置Shell脚本的执行选项(标志项).
设置执行选项标志
格式 set –[flag_char] 或 set +[flag_char]
“-”表示打开该标志项,标志字符前使用“+”表示关闭该标志项。
常用的标志项
f 禁止路径名扩展,即禁用文件通配符。
n 读脚本但不执行,用来检查脚本的语法。
x 使各命令行在完成参数替换且执行该行命令之前,先显 示该行的内容。重显的命令行以“+”号表示。
v 使shell对以后各命令行都按原样先在屏幕上显示出来, 若是输出语句则随后输出相应结果。
6、wait
格式 wait [pid]
等待进程ID为pid的进程终止,并报告终止状态。默认等待所有子进程。
wait命令的返回码始终是0。
五、shell程序调试
无IDE,使用原始方法。
不能正常运行的三种原因
运行环境问题.
使用非bash shell运行按bash语法书写的脚本。
PATH环境变量中没有包括“.”,直接运行当前目录下的脚本。
语法错误.
命令格式错误.
特殊符号未转义错误.
拼写错误.
括号、引号不成对错误.
逻辑错误.
使用echo或printf输出提示.
使用set命令打开“-x”或“-v”选项将Shell设置成跟踪模式.