linux&shell

目录

前言

一、Shell编程基础知识

1、什么是Shell

2、Shell 的特性

3、Shell 命令

一.shell变量概述 

一.变量命名规范

二.shell变量定义的方式

系统环境变量

位置变量

预定义变量

计算器脚本

if判断

for循环


前言

linux&shell_第1张图片

 
谁需要学习 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”
 

#!/bin/bash 

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 脚本第一行一定要指定解释器。

复杂脚本可以加注释

注释符号     #  注释

例:#查看文件是否存在

/usr/bin/ls -l     #查看文件是否存在

程序需要完整性

符号先写全  (容易丢失) 

show(  ){



}

一.shell变量概述 

变量=容器

放取=存取

定义变量

a(变量名)=(赋值)12(变量值)    #等号两边不能有空格

 echo $a   取变量值,变量之前加$取值

一.变量命名规范

命名要求:字母、数字、下划线、下划线符号(除下划线其他符号都不行)、数字不能开头。

变量名尽量具备含义,不能与系统命令相同

HostName_        # 驼峰式命名

存数据  

ip=192.168.8.128         #定义变量ip 值为192.168.8.128

取数据

echo ${ip}

可以引用定义过的变量

 

单引号只会原封不动输出

可以定义命令

linux&shell_第2张图片

Dir=$(ls)  //$()表示先执行

反撇号可以代替$( )

区别 : 反撇号不能嵌套

脚本里尽量不使用前台命令   -->  ls cat         想要显示提示信息  使用 echo “  ”

创建文件夹和文件都可以,他们都是后台命令

二.shell变量定义的方式

用户自定义变量:人为定义变量

系统环境变量:系统操作环境相关变量

位置参数变量:向脚本传递参数

预定义变量:bash定义好的变量,名称固定

定义的变量为局部变量   -->  作用域(当前bash)

更换bash后变量消失

linux&shell_第3张图片

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}' #取硬盘使用占比
Info="IP:${Ip} 内存使用占比:S {Mem} 便盈使用占比:${disk}"
echo $Info
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}

linux&shell_第4张图片

预定义变量

传递所有参数的内容(值) $*    $@                          

统计所有参数的个数$#

返回当前进程的运行pid    $$

返回上一个命令的执行结果     $?     返回值为0为真  返回其他值为假

交互式(动态)方式赋值     read -p  输出一个帮助性的语言

计算器脚本

linux&shell_第5张图片

linux&shell_第6张图片

指定备份的位置--> 保存到变量dir中 -->创建变量文件夹-->

linux&shell_第7张图片

 Ping -c 1 www.baidu,com        #-c指定ping的次数

 ping -c 1 -w 1 192.168.8.4       #-w指定等待时间

输入覆盖

 > file        //清空文件

linux&shell_第8张图片

混合输出&>  (正确错误信息都会输出   会覆盖源文件)  &>>追加输入(不会覆盖源文件)

 

/dev/null  垃圾桶   脚本中前台命令都需要输出到垃圾桶里

使用 echo $?  查看命令是否成功  0真   其他假

if判断

linux&shell_第9张图片

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 上执行权限

linux&shell_第10张图片

查看是否有backup文件夹 ,有的话备份 否则会创建并备份

linux&shell_第11张图片

你可能感兴趣的:(linux,运维,服务器)