Bash脚本基础

         BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。

         Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、

         条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操

         ,并可以完成图形工具所无法实现的功能。

 


 

         1. 创建包含bash命令的文本文件。文件的第一行应为:

         #!/bin/bash

         2. 使文件可执行(使用chmod +x scripts)

         3. 将文件放置在用户的$PATH的目录中

         ~/bin – 用于用户的私有程序

         /usr/local/bin – 本地开发、系统上的其他人使用的脚本

         /usr/local/sbin - 本地开发、由root使用的脚本

         直接运行脚本和使用source命令运行脚本是不同的!

         脚本调试模式:

         #!/bin/bash -x

         # bash -x scripts

 

 

 

##1. 引用和转义

引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。

 

引用有三种类型:

 

弱引用

将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量

扩展和命令扩展在双引号内仍起作用。

echo “can I have a $FRUIT”

echo “The current time is $(date +%r).”

 

强引用

将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:

echo “Make $$$ Fast”

rm 'untitled folder'

 

转义

非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而

不是PATH变量的内容。)

echo Make \$\$\$ Fast\!

ls untitled\ folder

 

 

例:

Scripts_文本文件

Scripts_source_02


 

 

 

##2. Shell变量

shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变

量的脚本。

例:

Scripts_文本文件_03

 

 

 

 

##3. 算术运算符:

 

算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。

 

Scripts_source_04



 

 

 

 

##4. 循环

for循环用于值列表中的相同命令的重复。

循环与计算结合:

 

 Scripts_文本文件_05

 

 

 

##5. 退出状态

Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash

当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。

 

例如:grep的退出状态的含义:

0 – 在指定的文件中找到了模式

1 – 在指定的文件中未找到模式

>1 – 一些其他错误(无法打开文件、错误的搜索表达式等)

推出状态的值被存储在"?"中,可以使用以下命令查看:

# echo $?

 

##6. test条件判断

test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式

true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语

,使用方括号"[]"将表达式括起来,这样更易于阅读。

 

字符串比较运算符:=、!=

例:

 Scripts_source_06

 

 

数字比较运算符:-eq、-ne、-lt、-le、-gt、-ge

例:

Scripts_source_07

 

 

 

##7. case语句

case语句 :它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪

部分代码。

 

例:

[root@web100 ~]# vim fruit.sh

Scripts_编写程序_08

 

 

##8. if语句

if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then

之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之

间的命令列表(反向平写if,标记if块的结束)。

例:

制作一个查看文件状态的脚本:

[root@web100 ~]# vim file.sh

Scripts_source_09

 

 

 

##9. expect语句

shell中利用expect实现自动应答脚本。

 

#!/usr/bin/expect

这一行告诉操作系统脚本里的代码使用那一个shell来执行。

 

set timeout 10

设置后面所有的expect命令的等待响应的超时时间,单位为秒。

 

spawn talk

spawn是expect的内部命令,作用是给后面的shell指令加个壳,用来传递交互指令。

 

expect "who"

判断上次输出结果里是否包含“who”的字符串,如果有则立即返回,否则等待超时时间后返回。

 

send "westos\n"

执行交互动作,相当于手工输入"westos"。

 

expect eof

作用是在输出中搜索文件结束符,如果没有这一行,脚本会立即退出,得不到正确结果。

 

interact

执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。否则退出登录。

 

$argv 参数数组

expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数。

 

 

例:

[root@web100 ~]# yum install expect -y

[root@web100 ~]# vim answer.exp

Scripts_文本文件_10

[root@web100 ~]# chmod +x answer.exp

[root@web100 ~]# answer.exp tom 30 java bad

Scripts_编写程序_11

 

 

##.10 环境变量

shell和脚本使用变量来存储数据 ,有些变量可以连同它们的内容传递给子进程,这些

变量我们称之为环境变量。

Scripts_source_12

 

使用env命令显示所有环境变量

使用set命令现实所有本地定义的shell变量

Bash启动脚本

在用户登录的时候,会运行全局变量文件/etc/profile,和用户自定义变量文件

~/.bash_profile去初始化它们的环境变量。

 

 

 

##11. 使用别名

 

alias命令可以用来自定义属于自己的系统命令,写入~/.bashrc 文件永久生效。

查看别名:

 

Scripts_source_13

 

设置别名:

[root@web100 ~]# alias host='hostname'

[root@web100 ~]# host

web100.westos.com

删除别名:

[root@web100 ~]# unalias host

 

 

制作一个倒计时10s的计数器的脚本:

[root@web100 ~]# vim 1.time.sh

Scripts_source_14

 

制作一个倒计时1分10s的计数器的脚本:

[root@web100 ~]# vim 2.time.sh

Scripts_文本文件_15

 

制作一个检查前10台主机能否ping通的脚本:

[root@web100 ~]# vim ping.sh

Scripts_文本文件_16

 

制作一个检查任意主机能否ping通的脚本:

[root@web100 ~]# vim ping*.sh

Scripts_编写程序_17

 

制作一个备份数据库的脚本:

[root@web100 ~]# vim mysql.sh

Scripts_编写程序_18

 

 

制作一个判断输入数值是否在区间范围内的脚本:

[root@web100 ~]# vim 1-10.sh

Scripts_编写程序_19

 

制作一个批量创建用户的脚本:

[root@web100 ~]# vim useradd.sh

Scripts_source_20