说到Shell编程,很多从事Linux运维工作的朋友都不陌生,都对Shell有基本的了解,初学者可能刚开始接触Shell的时候,有各种想法,感觉编程非常困难,SHELL编程是所有编程语言中最容易上手,最容易学习的编程脚本语言。
本章向读者介绍Shell编程入门、Shell编程变量、If、While、For、Case、Select基本语句案例演练及Shell编程四剑客Find、Grep、Awk、Sed深度剖析等。
16.1 SHELL编程入门简介
曾经有人说过,学习Linux不知道Shell编程,那就是不懂Linux,现在细细品味确实是这样。Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程序。
Shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出,简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。
Shell是用户与Linux操作系统之间沟通的桥梁,用户可以输入命令执行,又可以利用 Shell脚本编程去运行,如图16-1所示:
图16-1 Shell、用户及Kernel位置关系
Linux Shell种类非常多,常见的SHELL如下:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
不同的Shell语言的语法有所不同,一般不能交换使用,最常用的shell是Bash,也就是Bourne Again Shell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境。
Shell、Shell编程、Shell脚本、Shell命令之间都有什么区别呢?简单来说Shell是一个整体的概念,Shell编程与Shell脚本统称为Shell编程,Shell命令是Shell编程底层具体的语句和实现方法。
16.2 SHELL脚本及Hello World
要熟练掌握Shell编程语言,需要大量的练习,初学者可以用Shell打印“Hello World”字符,寓意着开始新的启程!
Shell脚本编程需要如下几个事项:
Shell脚本名称命名一般为英文、大写、小写;
不能使用特殊符号、空格来命名;
Shell脚本后缀以.sh结尾;
不建议Shell命名为纯数字,一般以脚本功能命名。
Shell脚本内容首行需以#!/bin/bash开头;
Shell脚本中变量名称尽量使用大写字母,字母间不能使用“-”,可以使用“_”;
Shell脚本变量名称不能以数字、特殊符号开头。
如下为第一个Shell编程脚本,脚本名称为:first_shell.sh,代码内容如下:
#!/bin/bash
#This is my First shell
#By author jfedu.net 2022
echo “Hello World ”
First_shell.sh脚本内容详解如下:
#!/bin/bash 固定格式,定义该脚本所使用的Shell类型;
#This is my First shell #号表示注释,没有任何的意义,SHELL不会解析它;
#By author jfedu.net 2022 表示脚本创建人,#号表示注解;
echo “Hello World !” Shell脚本主命令,执行该脚本呈现的内容。
Shell脚本编写完毕,如果运行该脚本,运行用户需要有执行权限,可以使用chmod o+x first_shell.sh赋予可执行权限。然后./first_shell.sh执行即可,还可以直接使用命令执行: /bin/sh first_shell.sh直接运行脚本,不需要执行权限,最终脚本执行显示效果一样。
初学者学习Shell编程,可以将在Shell终端运行的各种命令依次写入到脚本内容中,可以把Shell脚本当成是Shell命令的堆积。
16.3 Shell编程之变量详解
Shell是非类型的解释型语言,不像C++、JAVA语言编程时需要事先声明变量,Shell给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值,Shell变量为弱类型,定义变量不需要声明类型,但在使用时需要明确变量的类型,可以使用Declare指定类型,Declare常见参数有:
+ / - " - "可用来指定变量的属性,"+"为取消变量所设的属性;
-f 仅显示函数;
r 将变量设置为只读;
x 指定的变量会成为环境变量,可供shell以外的程序来使用;
i 指定类型为数值,字符串或运算式。
Shell编程中变量分为三种,分别是系统变量、环境变量和用户变量,Shell变量名在定义时,首个字符必须为字母(a-z,A-Z),不能以数字开头,中间不能有空格,可以使用下划线(_),不能使用(-),也不能使用标点符号等。
例如定义变量A=jfedu.net,定义这样一个变量,A为变量名,jfedu.net是变量的值,变量名有格式规范,变量的值可以随意指定。变量定义完成,如需要引用变量,可以使用$A。
如下脚本var.sh脚本内容如下:
#!/bin/bash
#By author jfedu.net 2022
A=123
echo “Printf variables is $A.”
执行该Shell脚本,结果将会显示:Printf variables is jfedu.net。
16.4 Shell编程之系统变量
Shell常见的变量之一系统变量,主要是用于对参数判断和命令返回值判断时使用,系统变量详解如下:
$0 当前脚本的名称;
$n 当前脚本的第n个参数,n=1,2,…9;
$* 当前脚本的所有参数(不包括程序本身);
$# 当前脚本的参数个数(不包括程序本身);
$? 命令或程序执行完后的状态,返回0表示执行成功;
$$ 程序本身的PID号。
16.5 Shell编程之环境变量
Shell常见的变量之二环境变量,主要是在程序运行时需要设置,环境变量详解如下:
PATH 命令所示路径,以冒号为分割;
HOME 打印用户家目录;
SHELL 显示当前Shell类型;
USER 打印当前用户名;
ID 打印当前用户id信息;
PWD 显示当前所在路径;
TERM 打印当前终端类型;
HOSTNAME 显示当前主机名。
16.6 Shell编程之用户变量
Shell常见的变量之三用户变量,用户变量又称为局部变量,主要用在Shell脚本内部或者临时局部使用,系统变量详解如下:
A=jfedu.net 自定义变量A;
N_SOFT=nginx-1.12.0.tar.gz 自定义变量N_SOFT;
BACK_DIR=/data/backup/ 自定义变量BACK_DIR;
IP1=192.168.1.11 自定义变量IP1;
IP2=192.168.1.12 自定义变量IP2。
创建Echo打印菜单Shell脚本,脚本代码如下:
#!/bin/bash
#auto install httpd
#By author jfedu.net 2022
echo -e '\033[32m-----------------------------\033[0m'
FILE=httpd-2.2.31.tar.bz2
URL=http://mirrors.cnnic.cn/apache/httpd/
PREFIX=/usr/local/apache2/
echo -e "\033[36mPlease Select Install Menu:\033[0m"
echo
echo "1)官方下载Httpd文件包."
echo "2)解压apache源码包."
echo "3)编译安装Httpd服务器."
echo "4)启动HTTPD服务器."
echo -e '\033[32m-----------------------------\033[0m'
sleep 20
运行脚本,执行结果如图16-2所示:
图16-2 Echo打印菜单脚本
16.7 If条件语句实战
Linux Shell编程中,if、for、while、case等条件流程控制语句用的非常多,熟练掌握以上流程控制语句及语法的实验,对编写Shel脚本有非常大的益处。
If条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断,if表达式如下:
if (表达式)
语句1
else
语句2
fi
If语句Shell脚本编程案例如下:
(1) 比较两个整数大小。
#!/bin/bash
#By author jfedu.net 2022
NUM=100
if (( $NUM > 4 )) ;then
echo “The Num $NUM more than 4.”
else
echo “The Num $NUM less than 4.”
fi
(2) 判断系统目录是否存在。
#!/bin/bash
#judge DIR or Files
#By author jfedu.net 2022
if [ ! -d /data/20140515 -a ! -d /tmp/2022/ ];then
mkdir -p /data/20140515
fi
If常见判断逻辑运算符详解:
-f 判断文件是否存在 eg: if [ -f filename ];
-d 判断目录是否存在 eg: if [ -d dir ];
-eq 等于,应用于整型比较 equal;
-ne 不等于,应用于整型比较 not equal;
-lt 小于,应用于整型比较 letter;
-gt 大于,应用于整型比较 greater;
-le 小于或等于,应用于整型比较;
-ge 大于或等于,应用于整型比较;
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z 空字符串;
|| 单方成立;
&& 双方都成立表达式。
(3) if多个条件测试分数判断。
#!/bin/bash
#By author jfedu.net 2022
scores=$1
if [[ $scores -eq 100 ]]; then
echo "very good!";
elif [[ $scores -gt 85 ]]; then
echo "good!";
elif [[ $scores -gt 60 ]]; then
echo "pass!";
elif [[ $scores -lt 60 ]]; then
echo "no pass!"
fi
16.8 MySQL数据库备份脚本
MySQL数据库备份是运维工程师的工作之一,如下为自动备份Mysql数据库脚本。
#!/bin/bash
#auto backup mysql
#By author jfedu.net 2022
#Define PATH定义变量
BAK_DIR=/data/backu
标签:脚本,bin,Shell,变量,16,编程,echo
From: https://blog.csdn.net/lihuhelihu/article/details/143796067