shell编程总结
程序结构:
#!/bin/bash
#程序功能及作者等
脚本序列
shell变量的定义/输出/输入方式
1.环境变量
HOME | 登录用户工作目录的完全路径名 |
LOGBANE | 当前用户名 |
PAIH | 用冒号分隔的目录搜索路径决定shell将在哪些目录中寻找命令或程序 |
PSI | 系统提示符#为管理员,$为普通用户 |
PWD | 当前工作目录的绝对路径名 |
UID | 当前用户的标识符,取值是用数字构成的字符串 |
2.用户自定义变量
简单变量
变量名(大写)=变量值
变量置换
变量名=${参数:=|-|+|? word}
3.全局变量与局部变量
Shell 函数中定义的变量默认也是全局变量,要想变量的作用域仅限于函数内部,可以在定义时加上local命令,此时该变量就成了局部变量
l全局变量:在脚本中定义的变量都是全局变量,包括脚本中的函数,函数中使用的变量依然在全局生效。
声明变量时,使用“declare”,可以通过选项在声明的时候给予某些属性。
declare 选项:
1 2 3 4 5 6 7 8 9 10 | -p: -a:数组索引 -A:数组变量 -f:仅仅代表函数名 -i:整型数 -l:小写字母(自动转) -r:只读变量声明 -t:跟踪属性,调试用 -u:大些字母 -x:通过环境变量导出的变量声明 |
l局部变量:通过“local”关键字在函数内部定义局部变量,可以接受“declare”的一切选项,最好在函数中定义局部变量时使用。当在函数中使用local时,它会导致变量名使可见范围仅限于该函数及其子函数。
4.变量重置 unset 变量名
临时取消环境变量用 unset
例如:unset USER,要永久生效须写到配置文件中
5.引用变量
先定义后引用
$变量名
6.预定义变量
$# | 位置参数的数量 |
$* | 所有位置参数的内容 |
$? | 命令执行后返回的状态 |
$$ | 当前进程的进程号 |
$! | 后台运行的最后一个进程的进程号 |
$0 | 程序名 |
7.位置变量
$1,$2...$n
8.输入输出命令
lecho
#echo 参数(参数中含有变量) //将显示变量的内容
#echo 字符串 //直接显示这些字符串
lread 变量名列表 //可接受用户输入的字符串
9.shell条件测试
l命令测试: $?
0则正确,非0则错误
l文件测试:
-e文件名 | 若文件存在且,返回真 |
-r文件名 | 若文件存在且可读,返回真 |
-w文件名 | 若文件存在且可写,返回真 |
-x文件名 | 若文件存在且可执行,返回真 |
-s文件名 | 若文件存在且至少有一个字符,返回真 |
-b文件名 | 若文件存在且为特殊字符,返回真 |
-c文件名 | 若文件存在且为字符型特殊文件,返回真 |
-f文件名 | 若文件存在且为普通文件,返回真 |
-d文件名 | 若文件存在且是目录,返回真 |
l数值比较:
-gt | > |
-lt | < |
-ge | >= |
-eq | == |
-le | <= |
-ne | != |
l字符串比较:
= | 判断两个字符串是否相等 |
= ! | 判断两个字符串是否不等 |
-z | 若字符串长度为0,返回真 |
-n | 若字符串长度不为0,返回真 |
l逻辑运算:
! | 非 | 对已有逻辑取反值 |
-a | and | 当两个测试条件都成立时返回真 |
-o | or | 两个中一个测试条件成立返回真 |
优先等级!>-a>-o
10.流程控制
if-else //分支流程控制
if 条件测试命令串
then
条件为真时执行的命令
else
条件为假时执行的命令
fi
if-elif-else //对于多分支的情况可以用if嵌套完成
if 条件测试命令串
then
条件1为真时执行
elif 条件测试命令串2
then
条件2为真时执行
…
then
条件n为真时执行
else
条件n为假时执行
case //多个分支中选择一个来执行
case 条件测试命令串 in
表达式1)
分支1执行的命令
..
,,
表达式2)
分支2执行的命令
….
表达式n)
分支n执行的命令
..
,,
*)
其他命令
esac
for 循环 //用于需要反复执行的命令
for变量名
[ In 数值列表 ]
do
循环执行的命令串
done
11.函数使用
l函数定义:在shell中,允许将一组命令集或者语句组成一个可重复使用的块,这些块称作shell函数
函数定义的基本格式为
函数名()
{
命令串
}
l函数调用
直接引用函数名即可
12.程序调试
#sh [选项] [文件]
(选项 -v 可以看详情
-x 按步骤来看详情)