设为首页 收藏本站
查看: 845|回复: 0

Bash shell编程基础

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-14 08:27:52 | 显示全部楼层 |阅读模式
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 目录,用于存放脚本。
wKioL1X1fwjiD5zqAABk2r9ZLNY677.jpg
其中#/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
wKiom1X1gGSiU2joAABZU99NLjQ993.jpg
//执行程序后查看 ,为1说明是正确的。

wKioL1X1gjjTwZ51AAA2rChWoxE700.jpg

script的执行方式的区别(bash,source,.)
以下面的name.sh脚本为例
wKioL1X1hwawADyGAABity56ycI142.jpg
[iyunv@lys scripts]# sh name.sh    //先用bash执行脚本
please input your first name: l
please input your last name:  ys
Your full name is : lys
wKiom1X1hX-xQ-VGAAAq_txQaTk848.jpg
看到没有怎么设置好的变量firstname,lastname都没有值,这是为什么呢?当你使用直接执行的方式来处理时,系统会给与一个新的bash来执行name.sh里面的命令,因此我们这个变量firstname,lastname其实是在新的bash里面执行的,子进程完成后,子进程内的各项变量或操作将会结束而不会传回父进程中。下面我们用source或者.来执行看看。
wKiom1X1htyiMijZAABQFXGJfn8287.jpg
我再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

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-113229-1-1.html 上篇帖子: [Outlook] 用powershell做outlook中的delegate. 下篇帖子: shell date时间相加减
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表