一、什么是Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。既是一种命令语言, 又是一种程序设计语言。   同时也是一种电脑程序与文本文件,内容由一连串的shell命令组成,经由Unix Shell直译其内容后运作。被当成是一种脚本语言来设计,其运作方式与直译语言相当,由Unix shell扮演命令行解释器的角色,在读取shell script之后,依序运行其中的shell命令,之后输出结果。利用Shell script可以进行系统管理,文件操作等。

 

 编程的基本概念:  程序:指令+数据  程序编程风格:       过程式:以指令为中心,数据服务于指令       对象式:以数据为中心,指令服务于数据      shell程序:提供了编程能力,解释执行  

语言区别//:

计算机:运行二进制指令 编程语言: 低级:汇编 高级: 编译:高级语言-->编译器-->目标代码 java,C# 解释:高级语言-->解释器-->机器代码 shell, perl, python  

编程逻辑处理方式: 顺序执行 循环执行 选择执行 shell编程:过程式、解释执行 编程语言的基本结构: 各种系统命令的组合 数据存储:变量、数组 表达式: a + b 语句:if

  ** Shell脚本的用处:** 通常运维工程师在运维工作时往往遇到很多需要重复性的工作 “如批量测试节点ip”“批量创建用户”等等大量费时费力的工作,此时写一个脚本让它去自动执行,这时脚本的好处就体现出来了,以下几点是简单总结的用途:

 ①自动化常用命令  
 ②执行系统管理和故障排除
 ③创建简单的应用程序 
 ④处理文本或文件

Shell格式

第一步:使用文本编辑器来创建文本文件 
第一行必须包括shell声明序列:#! #!/bin/bash 
添加注释
注释以#开头 
第二步:运行脚本 
给予执行权限,在命令行上指定脚本的绝对或相对路径 
直接运行解释器,将脚本作为解释器程序的参数运行

首行shebang机制常用几项机制如下

#!/bin/bash 
#!/usr/bin/python 
#!/usr/bin/per

shell脚本示例

vim qq.sh 在里面写如下的话 #/bin/bash echo "Hello Shell !" chmod +x qq.sh ./qq.sh
结果如下↓ [root@localhost /app]#./qq.sh Hello Shell ! ** 注** **:**脚本执行时需要有执行权限 使用chmod命令加权限 r=读写 w=写入 x=执行  

注意,一定要写成 ./qq.sh,而不是 qq.sh,运行其它二进制的程序也一样,直接写 qq.sh,linux 系统会去 PATH 里寻找有没有叫 qq.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 qq.sh 是会找不到命令的,要用 ./qq.sh 告诉系统说,就在当前目录找。(用bash 也可以写绝对路径 但过于麻烦通常都是在当前目录下“./”)

** 二、Sell变量**

定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:

your_name="blg.com"

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:   命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 中间不能有空格,可以使用下划线(_)。 不能使用标点符号。 不能使用bash里的关键字(可用help命令查看保留关键字)。  

根据变量的生效范围等标准:

本地变量:生效范围为当前shell进程;对当前shell之外 的其它shell进程,包括当前shell的子shell进程均无效   环境变量:生效范围为当前shell进程及其子进程 局部变量:生效范围为当前shell进程中某代码片断(通常 指函数)   位置变量:$1, $2, ...来表示,用于让脚本在脚本代码 中调用通过命令行传递给它的参数 特殊变量:$?, $0, $, $@, $#,$$*

$# 是传给脚本的参数个数 ** $0** 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 ** $*** 传递给脚本或函数的所有参数。 $$ 是脚本运行的当前shell的ID号,就是这些脚本所在的进程ID ** $?** 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

使用变量 使用一个定义过的变量,只要在变量名前面加美元符号即可,如:   删除变量

使用 unset 命令可以删除变量。语法:  

**unset name

  关于变量的内容我以后会不断完善,此篇先到这里,要是统一写到一篇里 字就太多啦。  

Shell字符串

单引号   str='this is a string'  

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
引号内的所有字符都只是字符而已,没有特殊含义

双引号   your_name='kki' str="Hello, I know your are "$kki"! \n"  

双引号里可以有变量 双引号里可以出现转义字符

  双引号的优点:   双引号里可以有变量 双引号里可以出现转义字符 除了$`和\之外,均无特殊含义。

获取字符串长度

string="abcd" echo ${#string} #输出 4

提取子字符串 以下实例从字符串第 2 个字符开始截取 4 个字符:  

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

查找字符 "i 或 s" 的位置:

string="runoob is a great company"
echo `expr index "$string" is`

**注:**此篇讲到的基础和理论内容比较多,没怎么实际操作如变量的用法等,在以后编写脚本的过程中遇到时会一并讲解。