一、什么是Shell

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

Shell基础(不定期更新)_第1张图片

 

 编程的基本概念:
 程序:指令+数据
 程序编程风格:
      过程式:以指令为中心,数据服务于指令
      对象式:以数据为中心,指令服务于数据
     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表示没有错误,其他表示有错误


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

Shell基础(不定期更新)_第2张图片

删除变量

使用 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

Shell基础(不定期更新)

提取子字符串
以下实例从字符串第 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`

Shell基础(不定期更新)_第3张图片

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