1 解析shell

shell是一个解释器,为了解释Unix命令,目的就是交互,因为shell就是为了实现Unix命令的思想来引入的;shell命令就是Unix系统命令;shell同时又是一种编程语言,如提供了变量定义、控制结构等。所以shell包含了unix系统命令、系统命令解释器和编程语言三个部分。 shell是一种泛称。Bash shell是shell的一种具体实现,它实现了定义了具体的UNIX系统命令、系统命令解析器和脚本编程语言。

2 注释

1 多行注释

2 单行注释

3 变量

3.1 变量

shell变量有四种:(1)本地变量、(2)环境变量,还有两种特殊变量:(3)位置变量和(4)特定变量参数。

3.2 变量操作

1. 使用常数赋值

2. 使用变量赋值

有时在$a两边最好加上双引号,但是这里会有问题,$a如果变量的值包含空格,例如hello world,那么该语句就会报错。

3.变量作和

注意:expr格式为

4 表达式

本小节主要介绍两个命令test和expr命令,正确返回0,错误返回1。如下

(1)test命令

  • test命令写法 [ 空格 condition 空格]
  • 三个逻辑操作符 -a 、-o、 !
  • 对于字符串、数字、文件状态的判断条件

(2)expr实现变量类加

4.1 test命令

test可以测试文件状态、字符串和数字三个应用。

1. test逻辑操作符

(1)与  -a

(2)逻辑或  -o

(3)逻辑否 

结果为:1

2. test 两种写法

(1)写法1:  test condition

(2)写法2:[空格 condition 空格]

3. 应用1:测试文件状态

(1)条件

untitled

(2)举例

4. 应用2:测试字符串

(1)条件

  • ==  两个字符串相等
  • != 两个字符串不等
  • -z  字符串为空串
  • -n 非空字符串

4. 应用3:测试数字

(1)条件

  • -eq  数值相等
  • -ne 数值不相等
  • -gt 第一个数大于第二个数  greater than
  • -ge 第一个数大于等于第二个数
  • -lt  第一个数小于第二个数 less than
  • -le 第一个数小于等于第二个数

(2)举例

5. 应用4 测试布尔

4.2 expr命令

1. expr介绍

expr命令一般作用于整数,一般格式为:expr argument 空格 operator 空格  argument

2. 使用

(1)直接使用

expr 3 空格+空格 3

输出结果为6

(2)和变量一起使用,实现变量累加

LOOP=1;

LOOP=expr $LOOP  +  1

echo $LOOP

3.  expr和test比较

二者都以0作为正确,1作为错误。

5 控制结构

5.1 if…then…fi

1. 写法

5.2 for…do…done的四种方式

1 方式1: 字符串

(1)写法

(2)举例

执行结果为

apple

pie

2. 方式2  for loop in  ls 路径

(1)写法

(2)举例

3. 方式3  for loop in ${数组[*]}

4方式4:   数值

(1)写法

(2)举例

结果:

5.3 whie…do…done

1. 写法

6 I/O标准输入输出

6.1 echo

1. -n 代表不自动换行

echo -n ”hello“

6.2 read

1. read 变量名

2. read -p  “字符串” 变量名

7 读写文件

7.1 按行读取一个文件

使用cat 、while和read来完成。创建一个文件test,内容是

hadoop

lucene

machine learning

代码如下:

结果显示:

hadoop

lucene

machine learning

7.2 读取每一个单词

使用cat和for实现,按空格切割。对于上述同一文件test,代码如下:

结果显示:

hadoop

lucene

machine learning

7.3 写入文件

1. echo “hello”  >   file.txt

这是将“hello”内容写入到file.txt中,首先删除文件内容,然后写入

2. ehoc “hello” >> file.txt

追加文件内容

8 函数

1. 函数解析

(1)函数定义写法

(2)在定义函数中使用形参

(3)在使用函数时向函数传递形参

(4)返回值

2. 使用将其他文件中函数,使用格式为:

8.1 单个文件中函数解析

8.1.1 函数写法和使用函数

1. 函数写法

2. 使用函数

使用函数时,直接输入函数的名字,如下代码

8.1.2 向函数中传递参数

1. 在定义函数时,函数内重新设置中间变量保存所传的参数。设置的变量形式为“下划线+变量名”。直接对中间变量进行赋值,如_term=$1可以将第一个参数赋值给_term。使用如下:

  • $0代表的是函数名字
  • $1 ,$2,….代表的是第1个参数,第2个参数….
  • $#代表的是函数参数的个数

2. 在使用函数时,没有如C/C++那样的函数列表,如果含有参数就在执行函数时,输入如下命令:

8.1.3 函数返回结果

通过$?来获取函数返回的结果。

8.2 函数位于其他文件

8.2.1 函数文件的导入

1. 使用写法

类似于C/C++中#include和python中模块导入import。这里写法如下

2. 举例

创建一个function.sh,如下

定义一个userfunction.sh文件如下:

8.2.2 set命令

用于查看当前shell文件导入的函数有哪些导入函数。如下定义一个testset.sh文件,如下:

8.2.3 撤销函数加载  

举例如下:

此时运行结果是:只执行一次test,第二个tes不执行。

9 脚本中运行Linux命令

有两种方法,如下

1方式1 使用反引号

2方式2 $(命令语句)

10 脚本中接受参数

脚本形参使用和函数形参使用是一样的。

1. 在定义脚本中如下:

  • $0代表的是函数名字
  • $1 ,$2,….代表的是第1个参数,第2个参数….
  • $#代表的是函数参数的个数

2.在使用脚本时如下

11 错误处理

1 从脚本中退出

举例如下如下,执行如下脚本时,调用了一个jar包,当jar返回错误时,脚本就退出:

对应的java的main函数如下:

12 数组

1. 数组定义

2. 数组前面都有一个${}

(1)对于求取数组的长度命令为:${#a[*]}

(2)访问一个元素${a[3]}

(3)打印一个数组${a[*]}

3. 数组的更新操作:插入、删除、更新

(1)插入

(2)更新

(3)删除

12.1 数组写法

一对括号表示是数组,数组的元素用“空格”符号分割开。

12.2 数组长度   

打印命令如下:

或者给某个变量赋值

12.3 数组读取 

三种读取方式,如下

1. 直接打印数组

2. 访问数的某一个元素

12.4 数组中元素的赋值、添加和删除元素

1. 数组元素的赋值

修改数组中某个元素的值

此时数组的元素就变成了3。

注意:有时数组及时数组的长度为3,此时也可以直接a[10]=6进行对数组赋值。只是从a[3]~a[6]的元素没有值。

2. 添加元素

或者使用变量:

3. 删除元素

(1)删除数组

(2)删除某一个元素

12.5 数组切片和替换

1. 数组元素的切片

2. 举例如下

输出结果为:1 2 3

2. 数组特殊使用-数组元素的替换

但是该操作不会改变原数组的内容,如下

untitled

如果要改变数组中元素的值,如下命令:

untitled

12.6 数组之间复制 

1. 写法

2. 举例

12.7 数组的遍历

1. 代码

12.8 字符串和数组转换

1. 代码

分为两步:

(1)第一步  IFS=”分隔符”

(2)第二步 数组=($字符串)

2. 注意

使用这个命令时一定要注意开头是

而不是

13 String处理

1 按指定的字符串截取:

(1)第一种方法:

  • ${varible##*string} 从左向右截取最后一个string后的字符串
  • ${varible#*string}从左向右截取第一个string后的字符串
  • ${varible%%string*}从右向左截取最后一个string后的字符串
  • ${varible%string*}从右向左截取第一个string后的字符串

其中“*”只是一个通配符可以不要,例子:

(2)第二种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。

可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:

2. 通过sed命令来处理文本

参考:http://www.heartthinkdo.com/?p=210

14 Demo

14.1 拼接一个月每日日期生成一个执行命令

代码如下

在bin/print.sh为

14.2 检测服务脚本

检测服务是挂掉,如果挂掉,就重新启动

附1-expect脚本

如下是使用expect脚本进行scp文件的,脚本名称为scp-file.sh

在使用时,sh scp-file.sh  /home/user/fille.txt

(全文完)

 

 

 

分类&标签

发表评论

电子邮件地址不会被公开。 必填项已用*标注