CGC1561039 阅读(95) 评论(0)

Bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計劃而编写。1989年釋出第一個正式版本,原先是計劃用在GNU作業系統上,但能运行于大多数类Unix系统的操作系统之上,包括Linux與Mac OS X v10.4都將它作為預設shell。它也被移植到Microsoft Windows上的Cygwin與MinGW,或是可以在MS-DOS上使用的DJGPP專案。在Novell NetWare與Andriod在上也有移植。1990年後,Chet Ramey成为了主要的维护者。為Bourne shell的後繼相容版本與開放原始碼版本,它的名稱來自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。

Shell中文意思叫做“壳”,在计算机中它是和用户直接交互的一个界面,而我们通常用到的是文本界面的shell:

 

bash启动的时候会运行各种不同的脚本。当bash作为一个登录的交互shell被调用,或者作为非交互shell但带有--login参数被调用时,它首先读入并执行文件/etc/profile。然后它会依次寻找~/.bash_profile,~/.bash_login,和~/.profile,读入并执行第一个存在且可读的文件。--noprofile参数可以阻止bash启动时的这种行为。当一个登录shell退出时,bash读取并执行~/.bash_logout文件,如果此文件存在。当一个交互的非登录shell启动后,bash读取并执行~/.bashrc文件。这个行为可以用--norc参数阻止。--rcfile file参数强制bash读取并执行指定的file而不是默认的~/.bashrc。如果用sh来调用bash,bash在启动后进入posix模式,它会尽可能模仿sh历史版本的启动行为,以便遵守POSIX标准。用sh名字调用的非交互shell不会去读取其他启动脚本,--rcfile参数无效。当bash以POSIX模式启动时(例如带有--posix参数)它使用POSIX标准来读取启动文件。在此模式下,交互shells扩展变量ENV,从以此为文件名的文件中读取命令并执行。bash会探测自己是不是被远程shell守护程序运行(通常是rshd)。如果是,它会读取并执行~/.bashrc中的命令。但是rshd一般不会用rc相关参数调用shell,也不会允许指定这些参数。

以上是我们对bash的简单介绍,接下来我们就说一下关于bash脚本编写的一些内容,在http://linuxlover.blog.51cto.com/2470728/1631593此篇博客中我提供过几个简单的例子大家可以去看一下。

1、bash中的变量

变量命名规则:

1.只能包含字母、数字和下划线,并且不能以数字开头

2.不应与系统中已有的变量重名

3.最好做到见名知意

1.1、变量:是指在内存中抽出一块空间,然后把这块空间命名,其内部可以放东西,类似一个有名字的容器。

环境变量:即全局变量,变量的作用域为本shell及其子shell。

本地变量:也有人叫全局变量相对局部变量而言,作用范围为整个shell自身。

局部变量:只用关键字local定义,作用范围为某段代码,一般都是在函数体中使用,函数调用结束变量撤销。

位置变量:即代表脚本各参数的位置,$0~$9,一共十个如果多余十个则需要用其他的方法,其中$0代表脚本本身。

特殊变量:具有特殊功能的变量

$# 表示传递到脚本的参数列表

$* 以一个字符串显示所有向脚本传递的参数,跟位置变量不同的是这里参数可超过9个。

$$ 表示当前运行脚本的进程ID号

$! 表示后台运行的一个进程的ID号

$@ 与$#相同,但是使用时加引号,并在引号中返回每一个参数

$- 显示shell使用的当前选项,与set命令相同

$? 显示最后命令运行的推出状态,0表示没有错误,其他任何值表示有错误

 

数值型:整型、浮点型

字符型:字符、字符串

布尔型:真、假

1.2、与变量相关的一些命令

declare 创建或显示变量

        参数-f 只显示函数名

        参数-r 创建只读变量(typeset也可以)

        参数-x 创建转出变量

        参数-i 创建整数变量

        如果参数中使用+来代替-,表示选项的含义相反。

export 创建环境变量

        参数– 表明选项结束,所有后面的参数都是实参

        参数-f 表示在”变量-值”对照中的变量是一个函数名

        参数-n 表示把全局变量转换成局部变量(也就是本地变量)。

        参数-p 显示全局变量列表

readonly 创建或显示只读变量

        参数– 表示选项结束

        参数-f 创建只读变量

set 设置或者重设各种shell

shift [n] 用来移动或调整位置变量,使$4赋给$3(也就是全都向前面移动一次),这个里面的n表示移动几位,默认是移动一位。

typeset 这个就跟declare相同了

unset 清除变量的定义

        参数– 表示选项结束

        参数-f 删除只读变量,但是不能sehll环境中制定的变量和函数。

read 用于从终端或者文件中读取输入,它读取整行输入,而末尾的换行符被翻译成 null(空字符串)。如果没有指定名称,读取的行就被赋值到特定的变量 REPLY 中。同时,read 命令还可以用来使程序暂时停下来等待用户输入回车。

        -a array 将单词清单放入 array 数组中

        first last 读取输入到第一个空格或回车,将输入的第一个单词放入 first 中,而其他的则放在 last 中

        -p prompt 打印提示,等待输入,并将输入存入 REPLY 中

        -r line 允许输入中包含反斜杠 ”\ ”

        -t timaout:指定等待接受参数的时间

        -n:表示不换行

1.3、变量替换

 

2、bash中的运算

2.1、算数运算:需要变量为数值型,但默认直接进行变量赋值时都是字符型,所以需要显示的定义可以使用declare或let命令。但bash是解释型语言(还有编译型语言),所以变量的定义非常宽泛,在定义时可以不不指明变量类型,使用时在指明就可以了。

算术运算符:

+:加

-:减

*:乘

/:整

%:取模

**:幂

运算方法:

let c=$a+$b

c=$[$a+$b]

c=$(($a+$b))

c=$(expr $a + $b) | c=`expr $a + $b`

2.2、逻辑运算:即与、或、非以及条件测试运算。

命令间的逻辑关系:

逻辑与:&& 有一个为假,结果为假

第一个条件为假时,第二个条件不再判断;

第一个条件为真时,第二个条件必须判断;

逻辑或:|| 有一个为真,结果为真

第一个条件为真时,第二个条件不再判断;

第一个条件为假时,第二个条件必须判断;

逻辑非:!

条件测试类型:

整数测试

字符测试

文件测试

条件测试的表达式:

[ expression ]  命令测试法  表达式

[[ expreession ]]  关键字测试法

test expression

整数比较(双目操作):

-eq:测试两个整数是否相等,如:[ $a -eq $b ] 测试a,b两个变量中的数是否一致,一致状态返回值为0 echo $?

-ne:测试两个整数是否不等,不等为真,相等为假

-gt:测试一个数是否大于另一个数,大于为真,否则为假

-lt:测试一个数是否小于另一个数,小于为真,否则为假

-ge:大于或等于

-le:小于或等于

文件测试:

-a file exists.

-b file exists and is a block special file.

-c file exists and is a character special file.

-d file exists and is a directory.

-e file exists (just the same as -a).

-f file exists and is a regular file.

-g file exists and has its setgid(2) bit set.

-G file exists and has the same group ID as this process.

-k file exists and has its sticky bit set.

-L file exists and is a symbolic link.

-n string length is not zero.

-o Named option is set on.

-O file exists and is owned by the user ID of this process.

-p file exists and is a first in, first out (FIFO) special file or named pipe.

-r file exists and is readable by the current process.

-s file exists and has a size greater than zero.

-S file exists and is a socket.

-t file descriptor number fildes is open and associated with a terminal device.

-u file exists and has its setuid(2) bit set.

-w file exists and is writable by the current process.

-x file exists and is executable by the current process.

-z string length is zero.

字符测试:字符串比较

双目:

>: 大于则为真

<: 小于则为真

>=:大于等于则为真

<=:小于等于则为真

==:等于则为真

!=:不等于则为真

单目:

-n String: 是否不空,不空则为真,空则为假

-z String: 是否为空,空则为真,不空则假


发表评论
切换编辑模式