1.何谓shell script shell script是利用shell的功能写一个“程序”,这个程序是使用纯文本文件,将一些shell的语法与命令写在里面。 2.脚本或程序源文件都是纯文本文件。 3.脚本或程序的执行一般有两种方式: 编译执行:预处理-->编译-->汇编-->链接;编译执行是一种计算机语言的执行方式。 由编译程序将目标代码一次性编译成目标程序,再由机器运行目标程序。如:PASCAL,C,C++等语言。 效率高于解释执行。 解释执行:由解释器全程参与运行过程,每次读取一行,运行一行;程序是由一组执行和数据组成。 4.bash的执行过程 1>命令的执行是从上到下,从左到右的分析与执行 2>命令执行时,命令和参数间的多个空白都会被忽略 3>空白行也会被忽略 4>没读取一个Enter字符,就开始执行该程序 5>“#”作为批注,任何加在#后面的数据都将视为批注 6>shell script 都是以*.sh结尾,而且一个shell脚本能否被执行,必须得有x权限 7>bash shell程序 必须由bash进程来执行 5.bash shell 中的变量,什么是变量?变量就是程序中可变化的量,通过变量来命名内存空间。 bash的变量类型如下: 本地变量:当前shell进程; 环境变量:当前shell进程及其子进程; 局部变量:某个函数执行过程; 位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数; 特殊变量: $?:上一个命令执行状态的返回值: 程序执行可能有两种返回值: 1. 程序执行结果 2. 程序状态返回吗(0-255) 0 则为执行正确 1-255 则执行出错(1,2,127系统预留); $#:获取当前shell命令行中参数的总个数 $*:获取当前shell的所有参数 “$1 $2 $3 …,受IFS控制 [email protected]:这个程序的所有参数 “$1″ “$2″ “$3″ “…”,不受IFS控制 $0 获取当前执行的shell脚本的文件名 $n 获取当前执行的shell脚本的第n个参数值,n=1..9 $$ 获取当前shell的进程号(PID) $! 执行上一个指令的PID 自定义脚本的状态结果: exit [n] 注意:脚本中任何位置执行了exit命令即会终止当前shell进程; 6.变量的类型:数值,字符,其中数值又可以分为整数和浮点数,字符分为ASCII和纯文本字符。 7.变量类型的作用:存储空间,进行数值运算,定义存储格式 8.bash的变量使用特点:弱类型、无须事先声明; 9.变量的命名规则: 首个字符必须为字母(a-z,A-Z) 中间不能有空格,可以使用下划线(_) 不能使用标点符号 不能使用bash里的关键字(可用help命令查看保留关键字) 10.本地变量和环境变量 1>本地变量:varname=value:作用域为整个bash进程可以使用。其中varname是变量名,=是赋值符号, value是值 引用: 弱引用: "", 其内部的变量引用会被替换为变量值; 强引用:‘‘,其变量的变量引用会保持原有字符; 命令引用:`COMMAND`, $(COMMAND),引用命令的执行结果; 声明为整型: declare -i name[=value] let name=value 2>环境变量:被“导出”的本地变量,作用域为当前shell进程及其子进程,不能影响到其父进程 环境变量的两种常见的定义方法: export name[=value] declare -x name[=value] 查看所有环境变量:env, printenv, export ,环境变量的销毁也是使用unset name 11.变量的生命周期,当一个shell进程终止后,变量就会自动销毁,或者手动销毁变量,可以使用unset 变量名
好了,现在我们开始进入bash shell的世界,首先我们通过bash shell 实现字符串的输出。为了以后编写shelll script 方便,建议大家建立一个~/scripts 目录,用于存放脚本。
其中#/bin/bash是shell编程的固定格式,来声明这个文件内的语法使用bash的语法,当这个程序执行时,它就能够加载bash的相关环境配置文件。整个script中,除了第一个“#”是用来申明shell之外,其他的#都是“批注”用途。为了以后方便查看shell script,建议写上本shell的功能,作者,时间等关键休息,如上所示。
bash的常用选项:
-n: 检查脚本中的语法错误;
-x:调试执行脚本;
检查脚本中的语法错误,什么都没有,说明没有语法错误。
[[email protected] scripts]# bash -n first.sh
调试执行脚本
[[email protected] scripts]# bash -x first.sh
+ echo -e ‘welcome to linux shell script.\a \n‘
welcome to linux shell script.
+ exit 0
自定义脚本的状态结果:
exit [n]
注意:脚本中任何位置执行了exit命令即会终止当前shell进程
//自定义状态返回值为1
//执行程序后查看 ,为1说明是正确的。
script的执行方式的区别(bash,source,.)
以下面的name.sh脚本为例
[[email protected] scripts]# sh name.sh //先用bash执行脚本
please input your first name: l
please input your last name: ys
Your full name is : lys
看到没有怎么设置好的变量firstname,lastname都没有值,这是为什么呢?当你使用直接执行的方式来处理时,系统会给与一个新的bash来执行name.sh里面的命令,因此我们这个变量firstname,lastname其实是在新的bash里面执行的,子进程完成后,子进程内的各项变量或操作将会结束而不会传回父进程中。下面我们用source或者.来执行看看。
我再echo $firstname $lastname 就有值了 。因为source和.会在父进程中执行,各项操作都会在原本的bash内生效。这下明白了bash,source和.执行shell脚本的区别了吧。
条件测试:
如何测试一个shell脚本呢?除了根据运行的命令的状态结果外,我们还可以使用测试表达式。当我们要检测系统上某些文件或者相关属性时,就可以使用test这个命令来显示整个结果。
1.关于两个整数的比较,例如,num1 ,num2
测试的标志 代表的意义
-eq 两数相等
-ne 两数不等
-gt num1大于num2
-lt num1小于num2
-ge num1大于等于num2
-le num1小于等于num2
2.字符串的数据,ASCII数值越大,字符比较时其值越大
测试的标志 代表的意义
-z string 是否为空;空则为“真”,否则为“假”
-n string 是否不空;不空则“真”,空则为“假”
test str1 = str2 判定str1是否等于str2,等于为真,不等于为假
test str1 != str2 判定str1是否不等于str2,不等于为真,等于为假
3.两个文件之间的测试,如test file1 和file2
测试标志 代表的意义
-nt 判定file1是否比file2新
-ot 判定file1是否比file2旧
-ef 判定file1和file2是否为同一个文件
4.文件权限的检测
测试参数 代表的意义
-r 检测此文件是否存在且具有“可读”权限
-w 检测此文件是否存在且“可写”权限
-x 检测此文件是否存在且“可执行”权限
-u 检测此文件是否存在且“SUID”权限
-g 检测此文件是否存在且“SGID”权限
-k 检测此文件是否存在且“Sticky bit”权限
-s 检测此文件是否存在且为“非空白文件”
-O 当前用户是否为指定文件的属主
-G 当前用户是否为指定文件的属组
5.文件类型的判定
参数 代表的意义
-e 是否存在;存在则为“真”,否则为“假”
-f 该文件名是否为普通文件
-d 文件是否存在且为目录
-b 是否存在且为块设备文件
-c 是否存在且为字符设备文件
-S 是否存在且为套接字文件
-P 是否存在且为管道文件
-L 是否存在且为链接文件
特殊设备:
/dev/null: 空,bit buckets,吞下所有数据,并直接丢弃;
/dev/zero:吐出一堆0