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