码迷,mamicode.com
首页 > 其他好文 > 详细

bash script 编程基础

时间:2015-09-14 12:25:24      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:linux bash script

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控制
$@:这个程序的所有参数 “$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:调试执行脚本;

检查脚本中的语法错误,什么都没有,说明没有语法错误。

[root@lys scripts]# bash -n first.sh

调试执行脚本

[root@lys 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脚本为例

技术分享

[root@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

 

本文出自 “天才来自重复” 博客,请务必保留此出处http://laoli110.blog.51cto.com/9136611/1694464

bash script 编程基础

标签:linux bash script

原文地址:http://laoli110.blog.51cto.com/9136611/1694464

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!