Shell
第1章 脚本语言的种类:1.1 编译型语言
定义:指用专用的编译器,针对特定的操作系统,将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码(具有操作数,指令,及相应的格式)这个过程叫做编译(./configure make makeinstall);编译好的可执行文件(.exe)可在相应的平台上运行(移植行差,但是运行效率高)
典型的编译型语言有:C C++
1.2 解释型语言
定义:指用专们的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言;相当于把编译型语言的编译连接过程混到一起同时完成的
解释性语言执行效率较低,且不能脱离解释器运行,但它的跨平台性比较容易,只需要提供特定的解释器即可
常见的解释性语言有:python ruby
1.3 脚本语言
定义:为了缩短传统的编写-编译-链接-运行过程而创建的计算机编程语言
常见的脚本语言有:javaScript python shell
第2章 关于shell2.1 查看系统中的shell
[root@cache01 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
2.2 什么是shell?
shell脚本语言是实现linux/unix系统管理及自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大都设计shell脚本的内容,每个合格的linux系统管理员或运维工程师,都需要能够熟练的编写shell脚本语言,并能够阅读系统及各类软件附带的shell脚本内容,只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作
2.3 什么是shell脚本?
命令,变量和流程控制语句等有机的结合起来
shell脚本擅长处理纯文本类型的数据,而linux中,几乎所有配置文件,日志,都是纯文本类型文件
第3章 脚本书写规范3.1 脚本统一存放目录,便于管理
[root@cache01 ~]# mkdir -p /server/scripts/
[root@cache01 ~]# cd /server/scripts/
3.2 选择解释器:
开头的#! 字符称为幻数,系统会根据#!后面指定的解释器来执行脚本中的内容
[root@cache01 ~]# head -1 /etc/init.d/*
==> /etc/init.d/functions <==
# -*-Shell-script-*-
==> /etc/init.d/netconsole <==
#!/bin/bash
==> /etc/init.d/network <==
#! /bin/bash
==> /etc/init.d/README <==
You are looking for the traditional init scripts in /etc/rc.d/init.d,
3.3 编辑使用vim
使用.vimrc文件,快速生成开头的注释信息
[root@cache01 ~]# cat .vimrc
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2, "##############################################################")
call setline(3, "# File Name: ".expand("%"))
call setline(4, "# Version: V1.0")
call setline(5, "# Author: da ya")
call setline(6, "# Organization: 850144102@qq.com")
call setline(7, "# Created Time : ".strftime("%F %T"))
call setline(8, "# Description:")
call setline(9, "##############################################################")
call setline(10, "")
endif
endfunc
3.3.1 使用后效果:
[root@cache01 ~]# cat /server/scripts/test.sh
#!/bin/bash
##############################################################
# File Name: test.sh
# Version: V1.0
# Author: da ya
# Organization: 123456@qq.com
# Created Time : 2018-01-01 04:48:15
# Description:
##############################################################
3.4 文件名规范
名字要有说明意义,能看懂这个脚本时干什么的,以.sh结尾
3.5 shell脚本的执行
[root@cache01 scripts]# sh test.sh
1
[root@cache01 scripts]# echo $file
[root@cache01 scripts]# . test.sh
1
[root@cache01 scripts]# echo $file
/etc/hosts
[root@cache01 scripts]# source test.sh
1
[root@cache01 scripts]# echo $file
/etc/hosts
第4章 什么是变量?4.1 变量的种类:
1. 环境变量:也可以成为全局变量,可以在创建他们的shell及其派生出来的任意子进程shell中使用,环境变量又可以分为自定义环境变量和bash内置的环境变量
2. 普通变量:可称为局部变量,只能在创建他们的shell函数或shll脚本中使用,普通变量一般是由开发者用户开发脚本程序时创建的
3. 特殊变量
4.1.1 全局变量
[root@cache01 scripts]# DYY=2
[root@cache01 scripts]# env |grep DY env查看所有全局变量
[root@cache01 scripts]# DY=1
[root@cache01 scripts]# export DY 导入变量
[root@cache01 scripts]# env |grep DY
DY=1
[root@cache01 scripts]# export DYY=2 直接定义全局变量
[root@cache01 scripts]# env |grep DY
DY=1
DYY=2
[root@cache01 scripts]# unset DYY 删除变量
[root@cache01 scripts]# env |grep DY
DY=1
4.2 环境变量配置文件:
4.2.1 都有哪些文件
/etc/proflie
/etc/bashrc
~/.bashrc
~/.bash_profile
/etc/proflie.d/ # 目录
4.2.2 四个文件读取顺序
① /etc/profile
② ~/.bash_profile
③ ~/.bashrc
④ /etc/bashrc
4.2.3 验证四个文件读取顺序的方法:
sed -i '1a echo "$(date +%T-%s) /etc/profile1" >>/tmp/clsn' /etc/profile
sed -i '$a echo "$(date +%T-%s) /etc/profile2" >>/tmp/clsn' /etc/profile
sed -i '1a echo "$(date +%T-%s) /etc/bashrc1" >>/tmp/clsn' /etc/bashrc
sed -i '$a echo "$(date +%T-%s) /etc/bashrc2" >>/tmp/clsn' /etc/bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bashrc1" >>/tmp/clsn' ~/.bashrc
sed -i '$a echo "$(date +%T-%s) ~/.bashrc2" >>/tmp/clsn' ~/.bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bash_profile1" >>/tmp/clsn' ~/.bash_profile
sed -i '$a echo "$(date +%T-%s) ~/.bash_profile2" >>/tmp/clsn' ~/.bash_profile
4.3 环境变量知识点小结:
1. 变量名通常要大写
2. 变量可以在自身的shell及子shell中使用
3. 常用export来定义环境变量
4. 执行env默认可以显示所有的环境变量名称及对应的值
5. 输出时用$+变量名,取消时用unset+变量名
6. 书写crond定时任务时要注意,脚本要用到的环境变量最好现在所执行的shell脚本中重新定义
7. 如果希望环境变量永久生效,可以将其放在用户环境变量文件或全局环境变量文件里
4.3.1 变量与引号:
[root@cache01 ~]# a=192.168.1.2
[root@cache01 ~]# b='192.168.1.2'
[root@cache01 ~]# c="192.168.1.2"
[root@cache01 ~]# echo "a=$a"
a=192.168.1.2
[root@cache01 ~]# echo "b=$b"
b=192.168.1.2
[root@cache01 ~]# echo "c=${c}"
c=192.168.1.2
[root@cache01 ~]# a=192.168.1.2-$a
[root@cache01 ~]# b='192.168.1.2-$a'
[root@cache01 ~]# c="192.168.1.2-$a"
[root@cache01 ~]# echo "a=$a"
a=192.168.1.2-192.168.1.2
[root@cache01 ~]# echo "b=$b"
b=192.168.1.2-$a
[root@cache01 ~]# echo "c=$c"
c=192.168.1.2-192.168.1.2-192.168.1.2
4.4 进程特殊变量:
位置变量 | 作用说明 |
$? | 获取执行上一个指令的执行状态返回值(0为成功,非零为失败),这个变量最常用 |
$$ | 获取当前执行的Shell脚本的进程号(PID),这个变量不常用,了解即可 |
$! | 获取上一个在后台工作的进程的进程号(PID),这个变量不常用,了解即可 |
$_ | 获取在此之前执行的命令或脚本的最后一个参数,这个变量不常用,了解即可 |
5.1 三种定义变量的方式:
1. 直接赋值
2. 传参
3. 交互式设置变量,使用read命令
5.2 命令行read命令使用
[root@backup yum.repos.d]# read
123
[root@backup yum.repos.d]# echo $REPLY
123
[root@backup yum.repos.d]# read name
456
[root@backup yum.repos.d]# echo $name
456
5.3 脚本中read命令使用;
[root@backup scripts]# vim test.sh
#!/bin/bash
read -p "please 1:" name1
read -p "please 2:" name2
expr $name1 + $name2 >/dev/null 2>&1
[ $? -eq 2 ] && echo please input && exit
5.4 传参的使用:
[root@backup scripts]# cat test.sh
#!/bin/bash
#read -p "please 1:" name1
#read -p "please 2:" name2
expr $1 + $2 >/dev/null 2>&1
[ $? -eq 2 ] && echo your input is error && exit
[root@backup scripts]# sh test.sh 1 1.2
your input is error
第6章 变量的子串:6.1 查看变量内容的字符个数
[root@cache01 scripts]# echo $name
cache
[root@cache01 scripts]# echo ${#name}
5
[root@cache01 scripts]# echo $name |wc -L
5
6.2 删除最短匹配的字符串
[root@cache01 scripts]# echo $name
abcABC123ABCabc
[root@cache01 scripts]# echo ${name#a*c}
ABC123ABCabc
6.3 删除最长匹配的字符串
[root@cache01 scripts]# echo ${name##a*c}
6.4 从后至前删除最短匹配字符串
[root@cache01 scripts]# echo ${name%a*c}
abcABC123ABC
6.5 从后之前删除最长匹配字符串
[root@cache01 scripts]# echo ${name%%A*c}
abc
6.6 替换字符串
[root@cache01 scripts]# echo ${name/abc/666}
666ABC123ABCabc
6.7 替换所有字符串
[root@cache01 scripts]# echo ${name//abc/666}
666ABC123ABC666
6.8 变量子串说明:
表达式 | 说明 |
${parameter} | 返回变量$parameter的内容 |
${#parameter} | 返回变内容的长度(按字符),也适用于特殊变量 |
${parameterioffset} | 在变量${parameter}中,从位置offset之后开始提取子串到结尾 |
${parameter:offset:length} | 在变量${parameter}中,从位置offset之后开始提取长度为length的子串 |
${parameter#word} | 从变量${parameter}开头开始删除最短匹配的word子串 |
${parameter##word} | 从变量${parameter}开头开始删除最长匹配的word子串 |
${parameter%word} | 从变量${parameter}结尾开始删除最短匹配的word子串 |
${parameter%%word} | 从变量${parameter}结尾开始删除最长匹配的word子串 |
${parameter/pattem/string} | 使用string代替第一个匹配的pattern |
${parameter//pattem/string} | 使用string代替所有匹配的pattern |
6.9 shell特殊扩展变量说明:
表达式 | 说明 |
${parameter:-word} | 如果parameter的变量值为空或未赋值,则会返回word字符串并替代变量的值用途.如果变量未定义,则返回备用的值,防止变量为空值或因未定义而导致异常 |
${parameter:=word} | 如果parameter的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用用途:基本同上一个${parameter>word},但该变量又额外给parameter变量赋值了 |
${parameter:?word} | 如果parameter变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值。用途:用于捕捉由于变量未定义而导致的错误,并退出程序 |
${parameter:+word} | 如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值 |
第7章 变量的数值计算:
7.1 仅支持整数的运算
[root@backup scripts]# echo $((a=1+1))
2
[root@backup scripts]# echo $a
2
[root@backup scripts]# echo $((1+1*6-2))
5
7.2 延伸扩展:
7.2.1 自加
[root@backup scripts]# echo $((a++))
2
[root@backup scripts]# echo $((a++))
3
7.2.2 自减
[root@backup scripts]# echo $((a--))
6
[root@backup scripts]# echo $((a--))
5
7.3 expr命令
1. 整数计算
2. 判断扩展名
3. 判断输入是否为整数,非整数返回值为2
4. 计算变量的长度
[root@backup scripts]# expr 1 + 1
2
[root@backup scripts]# echo $?
0
[root@backup scripts]# expr 1 + 1.1
expr: non-integer argument
[root@backup scripts]# echo $?
2
[root@backup scripts]# echo $[1+1]
2
7.4 支持小数运算的命令
7.4.1 bc
[root@backup scripts]# echo 2.2+2.6 |bc
4.8
7.4.2 awk
[root@backup scripts]# awk BEGIN'{print 1+1}'
2
[root@backup scripts]# echo "7.7 3.8"|awk '{print ($1-$2)}'
3.9
7.4.3 python
[root@backup scripts]# python
Python 2.7.5 (default, Nov 20 2015, 02:00:19)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+1
2