目录
前言
一、Shell编程基础知识
1、什么是Shell
2、Shell 的特性
3、Shell 命令
一.shell变量概述
一.变量命名规范
二.shell变量定义的方式
系统环境变量
位置变量
预定义变量
计算器脚本
if判断
for循环
前言
谁需要学习 Shell 编程?
Linux运维工程师:编写Shell程序进行服务集群管理。
Python和JavaEE程序员:编写Shell脚本程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
大数据程序员:编写Shell程序来管理集群。
一、Shell编程基础知识
1、什么是Shell
Shell是一种用户使用的解释型程序,它是操作系统的一部分,派生自多种不同的系统。它是一种命令解释器,它可以读取用户的输入,解释该输入,并执行相应的命令。
Linux的Shell有很多种,如bash,csh,ksh等。当前常用的为bash
2、Shell 的特性
(1)交互式:用户可以通过Shell的界面实现与计算机的交互,以便用户和计算机之间的信息交换。
(2)自动化: Shell 可以将用户编写的一系列命令,保存为脚本,并在需要的时候自.动执行,以减少用户的工作量。
(3)扩展性: Shell 可以实现过滤和管道功能,可以与其他应用程序和编程语言结合使用,实现不同应用程序、不同编程语言之间的信息传递。
3、Shell 命令
Shell 编程快速入门
进入 Linux 终端,编写一个 Shell 脚本 hello.sh :
创建脚本文件 以.sh为后缀
vi hello.sh
输出 “hello world”
1. #!/bin/bash 2. 3. echo 'hello world!'
运行:
chmod +x hello.sh 给文件上权限
./test.sh #当前路径下执行,以普通用户执行,需要有x执行权限
/sh/test.sh #绝对路径,以普通用户执行,需要有x执行权限
sh test.sh #以管理员身份执行,没权限也可以
source test.sh #以管理员身份执行,没权限也可以
. tets.sh #以管理员身份执行,没权限也可以
终端打印出 hello world! 。
说明:
#! 告诉系统这个脚本需要什么解释器来执行。
文件扩展名 .sh 不是强制要求的。
方法1 直接运行解释器,hello.sh 作为 Shell 解释器的参数。此时 Shell 脚本就不需要指定解释器信息,第一行可以去掉。
方法2 hello.sh 作为可执行程序运行,Shell 脚本第一行一定要指定解释器。
复杂脚本可以加注释
注释符号 # 注释
例:#查看文件是否存在
1. /usr/bin/ls -l #查看文件是否存在 2.
程序需要完整性
符号先写全 (容易丢失)
1. show( ){ 2. 3. 4. 5. }
一.shell变量概述
变量=容器
放取=存取
定义变量
a(变量名)=(赋值)12(变量值) #等号两边不能有空格
echo $a 取变量值,变量之前加$取值
一.变量命名规范
命名要求:字母、数字、下划线、下划线符号(除下划线其他符号都不行)、数字不能开头。
变量名尽量具备含义,不能与系统命令相同
HostName_ # 驼峰式命名
存数据
ip=192.168.8.128 #定义变量ip 值为192.168.8.128
取数据
echo ${ip}
可以引用定义过的变量
单引号只会原封不动输出
可以定义命令
Dir=$(ls) //$()表示先执行
反撇号可以代替$( )
区别 : 反撇号不能嵌套
脚本里尽量不使用前台命令 --> ls cat 想要显示提示信息 使用 echo “ ”
创建文件夹和文件都可以,他们都是后台命令
二.shell变量定义的方式
用户自定义变量:人为定义变量
系统环境变量:系统操作环境相关变量
位置参数变量:向脚本传递参数
预定义变量:bash定义好的变量,名称固定
定义的变量为局部变量 --> 作用域(当前bash)
更换bash后变量消失
1.定义字符串时必须要加双引号
2.引用时需加大括号
案例:引用串联组成新变量
Ifconfig ens33 |head-2 |tail-1|awk '{print $2}' #截取出ip信息
Free -m |grep ^M|awk '{print $3/$2*100}' #计算内存使用率
Df -hT |grep centos7-root |awk '{print $6}' #取硬盘使用占比
1. Info="IP:${Ip} 内存使用占比:S {Mem} 便盈使用占比:${disk}" 2. echo $Info 3. IP:192.168.8.128 内存使用占比:40号硬盘使用占比:28号
查看变量
set
清除变量
unset time #直接跟变量名
嵌套卸载软件 先运行里面的$( )再运行外面的$ ( )
定义全局变量 export 切换bash也不会丢失
export Ip=$(ifconfig ens33|head -2|tail -1 |awk '{print $2}')
系统环境变量
PATH路径
添加环境变量 |
//${ }:跟命令文件 ,不会覆盖原路径 |
/etc/profile 是PATH的shell配置文件
位置变量
参数中间由空格隔开
$0表示返回文件名
传递参数$1第一个参数 $2第二个参数进行脚本里的操作
到10时需要${10}
预定义变量
传递所有参数的内容(值) $* $@
统计所有参数的个数$#
返回当前进程的运行pid $$
返回上一个命令的执行结果 $? 返回值为0为真 返回其他值为假
交互式(动态)方式赋值 read -p 输出一个帮助性的语言
计算器脚本
指定备份的位置--> 保存到变量dir中 -->创建变量文件夹-->
Ping -c 1 www.baidu,com #-c指定ping的次数
ping -c 1 -w 1 192.168.8.4 #-w指定等待时间
输入覆盖
> file //清空文件
混合输出&> (正确错误信息都会输出 会覆盖源文件) &>>追加输入(不会覆盖源文件)
/dev/null 垃圾桶 脚本中前台命令都需要输出到垃圾桶里
使用 echo $? 查看命令是否成功 0真 其他假
if判断
for循环
ip=192.168.8. #定义变量ip为192.168.8.网段
for I in {1..8} #for循环起始 定义变量I 值为后面的循环值
do
ping -c 1 -w 1 ${ip}${i} $> /dev/null #执行ping命令并把结果输出到垃圾桶中
if [ $? -eq 0 ];then #if判断 $? :返回上一条命令的结果 -eq :0 为真,其他为假
echo "${ip}${i}可以通信!" #0为真那么执行
else
echo"${ip}${i}不可以通信!" #其他数执行
fi #if循环终结
done #do循环终结
编辑好脚本后chmod+x 上执行权限
查看是否有backup文件夹 ,有的话备份 否则会创建并备份