Shell入门
1.1 什么是shell?
Shell其实是一个命令解释器,作用是解释执行用户输入的命令以及程序等,用户每输入一条命令,Shell给予解释执行一条。这种键盘一输入命令,就可以立即得到回应的对话方式,称为交互模式。
Shell存在于操作系统的最外层,负责与用户直接对话。处理用户的输入,并将操作系统执行结果返回给用户。在用户登陆到操作系统之后的所有操作均由Shell解释执行。Shell在操作系统中所处的位置如下
![9469008-a2c8705971d1539f.png](https://i-blog.csdnimg.cn/blog_migrate/0757d9a701765a3c009773a7c0222441.png)
什么是shell脚本?
简言之,如果shell命令通过写入到一个程序文件并执行的时候,此程序我们就称之为shell脚本。但是在生产环境中的Shell脚本不仅仅是这么简单,而是将一些命令、变量以及流程控制语句有机结合并生成的功能完善的强大的应用程序。
什么时候使用shell脚本?
Linux批量管理
自动化完成系统优化
自动化安装Linux操作系统(kickstart和cobbler)
测试工具和内容自动化
邮件自动发送
服务自动重启
代码上线
定时备份和定时启停服务
Linux系统监控、服务监控、端口监控、IP黑名单监控、流量监控(脚本+zabbix)
服务的日志切割、存储备份、日志分析等等
如何学好shell脚本?
基础变量、条件表达式、流程判断、if、for循环、while循环、case语句、循环控制
从简单的判断和循环开始写
阅读、模仿、尝试从零开始写
写注释,将任务分解成一个个小任务,类似于打游戏闯关
找一本合适的教材,或者自己认真记笔记
多练习-思考-练习-思考,循环往复
解释型语言和编译型语言
编译型语言:
指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码,这个过程叫做编译。
编译好的可执行文件(.exe),可在相对应的平台运行(移植性差,但是效率高)。
C\C++.....
解释型语言:
用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言,相当于把编译型语言的编译执行过程混合在一起同时完成的。
编译型语言执行效率较低,切不能脱离解释器运行。但是跨平台比较容易,只需提供相应的解释器
shell\python
注:Java属于特殊的。既可以说成是解释型语言,又可以说成是编译型语言
shell是命令解释器
shell脚本是由命令组合成的一个可执行的文件
编译型语言和解释型语言
shell脚本建立和执行
解释器类型
bash是centos中的默认解释器
sh
脚本定义
脚本开头
!/bin/bash
父shell和子shell
脚本嵌套
父shell中的环境变量,在子shell中可以看到
而子shell中的变量,在父shell中看不到
shell执行方式
sh & bash,最常用的使用方式
cat *.sh | bash,适用于执行多个脚本
sh < oldboy.sh,了解一下,输入重定向
/root/oldboy.sh,需要执行权限
. oldboy.sh
source oldboy.sh
shell开发习惯
脚本存放在固定目录
开头加脚本解释器信息
附带作者和版权信息
脚本中尽量不用中文
脚本扩展名用.sh
成对的符号一次性书写完成
注意缩进
养成写注释的良好习惯
总结
脚本放在指定目录
创建脚本,后缀是.sh
在第一行顶格添加命令解释器的声明#!/bin/bash
添加作者时间和版权信息
养成良好习惯,添加注释
Centos7默认解释器是/bin/bash
退出当前shell的命令是:exit
有一个小问题:在使用history的时候,加入脚本中,执行什么也不会输出。
在脚本中加入set -o history即可解决,但是默认显示的是这个脚本里的历史命令。但是
如果还想显示脚本外的历史记录,可以使用source 执行脚本。
变量基础
定义变量
值可变的量,称为变量
变量名=变量值,常说的变量,一般是变量名
字母数字下划线,不能是数字开头
环境变量和普通变量
环境变量(全局变量)
可在创建他们的shell以及派生出来的任意子shell中使用
环境变量包括内置的环境变量和自定义的环境变量,且通常为大写。
环境变量的定义方式:
declare -x 变量名=value
export 变量名=value
环境变量有四个文件,他们的执行顺序如下图所示:
![9469008-93cc5e70f83f9553.png](https://i-blog.csdnimg.cn/blog_migrate/30aeaee84a2a71f55a7745fb4f7c14b5.png)
登陆shell会加载所有的环境变量
非登陆shell可能会加载~/.bashrc或者/etc/bashrc(上图非绿色部分),然而有些定时任务以上两个根本不会加载,所以需要手动指定,建议在定义变量时定义到/etc/bashrc
可以在环境变量文件中定义普通变量
普通变量
普通变量只有在当前shell下才能使用
定义方式
# 适用于一般场景,不适用于带有空格等字符
变量名=value
# 所见即所得的定义方式
变量名=’value’
# 解析双引号之内的变量
变量名=”value
注意点:(举例说明)
- 变量如果后面有内容,一定要把变量括{}起来
- 希望变量内容原样输出则加单引号
- 希望获取变量中的命令执行结果用``或者$()
1、定义环境变量的方式:
export 变量名=变量值
2、定义普通变量的方式:
变量名=变量值
3、定义变量的三种方式
# 适用于一般场景,不适用于带有空格等字符
[export] 变量名=value
# 所见即所得的定义方式
[export] 变量名=’value’
# 解析双引号之内的变量
[export] 变量名=”value”
4、环境变量文件的加载顺序
/etc/profile ===> ~/.bash_profile ===> ~/.bashrc ===> /etc/bashrc
5、非登录式(ssh)的shell只加载后两个
临时变量和永久变量(了解)
如果按照变量的生存周期来划分的话,Linux变量可以分为两类:
永久变量:需要修改变量配置文件,使得变量永久生效
临时变量,使用export命令或者直接在当前shell中赋值的变量
shell特殊变量
参数特殊变量
特殊变量 作用说明n 获取当前执行shell脚本的第n个参数值,若n>9,则用大括号包裹,如
# 传递到脚本的参数个数
@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
进程特殊变量
特殊变量 作用说明! 后台运行的最后一个进程的ID号,此变量不常用,了解即可
$_ 之前运行脚本的最后一个参数,此变量最不常用,了解即可
shell变量子串
表达式 作用说明param内容
param内容的字符长度,也适合特殊变量,此表达式最常用
param中,从位置offset之后开始提取子串到结尾
param中,从位置offset之后开始提取长度为length的子串
param开头删除最短匹配的word子串
param开头删除最长匹配的word子串
param结尾删除最短匹配的word子串
param结尾删除最长匹配的word子串
param中符合pattern的第一个内容用string取代
param中符合pattern的所有内容用string取代
总结:获取变量字符串长度的五种方法:
[root@shell ~]# oldboy="www.oldboy.com"
[root@shell ~]# echo ${#oldboy}
14
[root@shell ~]# echo ${oldboy} |wc -L
14
[root@shell ~]# expr length $oldboy
14
[root@shell ~]# echo ${oldboy}|awk '{print length}'
14
[root@shell ~]# echo ${oldboy}|awk '{print length($0)}'
14
练习:
1、 请使用shell脚本打印下面语句中字符数不小于6的单词
I am teacher oldchang and I like eating and sleeping
for n in $*
do
[ ${#n} -ge 6 ] && echo $n
done
2、 写出shell脚本,通过传参的方式,传入以下内容,并打印下面语句中字符数不小于6的单词
I am teacher oldchang and I like eating and sleeping
read -p '请输入你要处理的字符串: ' n
for n in $n
do
if [ ${#n} -ge 6 ];then
echo $n
fi
done
变量传参
脚本变量传参的三种方式:
直接赋值
[oldchang@oldboy-node101 ~]$ cat 1.sh
IP=127.0.0.1
echo $IP
[oldchang@oldboy-node101 ~]$ sh 1.sh
127.0.0.1
传参方式
[oldchang@oldboy-node101 ~]$ cat 1.sh
IP=$1
echo $IP
[oldchang@oldboy-node101 ~]$ sh 1.sh 127.0.0.1
127.0.0.1
read方式
[oldchang@oldboy-node101 ~]$ cat 1.sh
read -p "请输入一个参数: " IP
echo $IP
[oldchang@oldboy-node101 ~]$ sh 1.sh
请输入一个参数: 127.0.0.1
127.0.0.1