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进程及其子进程;
局部变量:某个函数执行过程;
位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;
特殊变量:$?, $*, $@, $#, $$
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:调试执行脚本;
检查脚本中的语法错误,什么都没有,说明没有语法错误。
[iyunv@lys scripts]# bash -n first.sh
调试执行脚本
[iyunv@lys scripts]# bash -x first.sh
+ echo -e 'welcome to linux shell script.\a \n'
welcome to linux shell script.
+ exit 0
特殊变量:
$?:上一个命令执行状态的返回值:
程序执行可能有两种返回值:
1. 程序执行结果
2. 程序状态返回吗(0-255)
0 则为执行正确
1-255 则执行出错(1,2,127系统预留)
$#:获取当前shell命令行中参数的总个数
$*:获取当前shell的所有参数 “$1 $2 $3 …,受IFS控制
$@:这个程序的所有参数 “$1″ “$2″ “$3″ “…”,不受IFS控制
$0 获取当前执行的shell脚本的文件名
$n 获取当前执行的shell脚本的第n个参数值,n=1..9
$$ 获取当前shell的进程号(PID)
$! 执行上一个指令的PID
自定义脚本的状态结果:
exit [n]
注意:脚本中任何位置执行了exit命令即会终止当前shell进程
//自定义状态返回值为1
//执行程序后查看 ,为1说明是正确的。
script的执行方式的区别(bash,source,.)
以下面的name.sh脚本为例
[iyunv@lys 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
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com