IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> shell编程与运维 -> 正文阅读

[系统运维]shell编程与运维

shell编程与运维

一、Shell脚本概述

通过shell中的各种命令,开发者和运维人员可以对服务器进行维护工作。
但每次都手动输入命令,工作效率太低,而且很容易出错,尤其是需要维护大量服务器时。
为了能够对服务器批量执行操作,我们可以将需要执行的命令写入文件,批量执行,这种文件便是shell脚本。
shell脚本一般是以.sh
结尾的文本文件,当然,也可以省略扩展名。

二、Shell脚本首行

脚本文件第一行通过注释的方式指明执行脚本的程序。
在shell中,#开头的文本是注释,但第一句 #!
开头的这句比较特殊,它会告诉shell应该使用哪个程序来执行当前脚本。
常见方式有:

  • #!/bin/sh
  • #!/bin/bash
  • #!/usr/bin/env bash

Python脚本的第一句一般是 #!/usr/bin/env python

三、第一个脚本

  1. 创建cpu-count.sh文件
  2. 将下面文本写入cup-count.sh中
#!/bin/bash

echo "hello"
echo "I am whoami !"
echo "I love Linux"
echo "The Cpu in my PC has `cat /proc/cpuinfo grep -c processor` cores"
exit 0
  1. 执行 chmod a+x cpu-count.sh 对脚本授予可执行权限
  2. 输入 ./cpu-count.sh 执行脚本
  3. 查看脚本的退出状态:echo $?
    • Linux 中的所有程序执行结束后都有状态码
    • 状态码为 表示正常,状态码为 正整数 代表异常退出

四、变量

  1. 定义
    变量的定义与其他语言差距不大,需要注意的是赋值前后没有空格。
#变量定义:等号前后没有空格
a=123456
b=xyz
  1. 使用
    使用变量时,变量名前面加上 $
echo "--$a--\n===$b==="
printf "---$a---\n===$b===\n"
  1. 注意 引号 的差别
echo "--$a--\n===$b==="
echo '--$a--\n===$b==='
  1. 定义当前Shell下的全局变量

    1. 定义:export ABC=9328324892498892489
    2. 定义完后,在终端里用source加载脚本:source ./test.sh
  2. 常用的系统环境变量

    • $PATH:可执行文件目录
    • $PWD:当前目录
    • $HOME:家目录
    • $USER:当前用户名
    • $UID:当前用户的uid

五、获取用户输入

read -p "请输入一个数字:" num
echo "你输入的是:$num"

六、脚本里的引号

在shell里支持三种引号,他们的使用场景以及效果会有差异。

  • 反引号:里面的内容会被解析成脚本。
echo `ls -a /home/chris`  #打印/home/chris目录下的所有文件和文件夹
  • 双引号:它里面的大部分内容会原样显示,但是如果是一个变量,这个变量会被解析。
name=zhangsan
echo "大家好,我是$name" #大家好,我是zhangsan
  • 单引号:它里面的内容会完全原样输出,就算是有变量,也不会被解析。
name=zhangsan
echo '大家好,我是%name' #大家好,我是$name

七、脚本里的$

  • ${var}用来获取一个变量的值,一般情况下,大括号可以省略不写。
name=zhangsan
echo ${name} 	#zhangsan
echo $name 		#zhangsan
  • 特殊变量
$#  代表传入参数的个数

$@  代表传入参数的列表

$0  代表脚本文件的名字

$1  代表传入的第一个参数,$2,$3...以此类推

$*  以字符串方式显示所有传入的参数

$$  脚本运行的进程ID

$?  显示最后命令的退出状况,0表示没有错误

  • $(cmd)用来执行括号里脚本命令,相当于使用反引号。
echo $(ls /home/chris/Desktop) #列出当前用户的桌面上的所有文件和文件夹
  • $((expression))用来计算数学表达式expression的值。
echo $((1+1)) #2

八、分支语句:if

分支控制语句完整格式为:

if command;then
	commands
elif command;then
	commands
else
	commands
fi
  1. if 语句检查判断的依据实际上是,后面所跟的命令的状态码:0为true,其他值为false
if ls /xxx;then
	echo 'exists xxx'
else
	echo 'not exist xxx'
fi
  1. 条件测试命令:[ … ]

    • shell提供了一种专门用做条件测试的语句 [ … ]
    • 这一对方括号本质上是一个命令,里面的条件是其参数,所以 [ 的后面和 ] 的前面必须有空格,否则会报错。
    • 它可以进行三种比较
      • 数值比较
      • 字符串比较
      • 文本比较
    • 用法:
     if [ condition ];then
    	 commands
     fi
    
  2. 条件列表

    • 数值比较
      Condition说明
      n1 -eq n2检查n1是否与n2相等
      n1 -ge n2检查n1是否大于或等于n2
      n1 -gt n2检查n1是否大于n2
      n1 -le n2检查n1是否小于n2
      n1 -lt n2检查n1是否小于n2
      n1 -ne n2检查n1是否不等于n2
    	if [ 3 -gt 2 ];then
    		echo '3>2'
    	else
    		echo '3<2'
    	fi
    
    • 字符串比较
      Condition说明
      str1 = str2检查str1是否和str2相同(注意:等号两边要加空格)
      str1 != str2检查str1是否和str2不同
      str1 < str2检查str1是否小于str2(需要使用[[]])
      str1 > str2检查str1是否大于str2(需要使用[[]])
      -n str1检查str1的长度是否为非0(变量需要添加双引号)
      -z str1检查str1的长度是否为0
    		read -p '输入一段内容' x
    		read -p '输入一段内容' y
    		if [ $x = $y ];then
    			echo '$x等于$y'
    		else
    			echo '$x不等于$y'
    		fi
    
    		read -p '输入一段内容' x
    		read -p '输入一段内容' y
    		if [ $x != $y ];then
    			echo '$x不等于$y'
    		else
    			echo '$x等于$y'
    		fi
    
    		read -p '输入一段内容' x
    		read -p '输入一段内容' y
    		if [[$x>$y ]];then
    			echo '$x大于$y'
    		else
    			echo '$x不大于$y'
    		fi
    
    • 文件比较
      Condition说明
      -d file检查file是否存在并且是一个目录
      -e file检查file是否存在
      -f file检查file是否存在并且是一个文件
      -r file检查file是否存在并且可读
      -w file检查file是否存在并且可写
      -x file检查file是否存在并且可执行
      -s file检查file是否存在并且非空
      -O file检查file是否存在并且属于当前用户所有
      -G file检查file是否存在并且所属组与当前用户相同
      file1 -nt file2检查file1是否比file2新
      file1 -ot file2检查file1是否比file2旧
    read -p '输入一个路径' path
    if [ -d $path ];then
    	echo $path是一个文件夹
    else
    	echo $path不是一个文件夹
    fi
    

九、case语句

case "$var" in
	exp1)
	command1
	;;
	exp2)
	command2
	;;
	exp3)
	command3
	;;
	*)
	command4
	;;
esac

示例:

read -p "请输入数字" num
case $num in
	0)
		echo "星期日"
		;;
	1)
		echo "星期一"
		;;
	2)
		echo "星期二"
		;;
	3)
		echo "星期三"
		;;
	4)
		echo "星期四"
		;;
	5)
		echo "星期五"
		;;
	6)
		echo "星期六"
		;;
esac

十、循环语句:for

Shell中的循环结构有三种:for 、while 和 until,这里重点介绍 for 循环。

  1. for循环的基本格式:
for 变量 in 系列
do
	要执行的命令
done
  1. 练习:打印1到10的偶数

    # 方法一
    for i in `seq 1 10`
    do
            if [ $[ $i % 2 ] == 0 ];then
                    echo "偶数是$i"
            fi
    done
    # 方法二
    for i in `seq 1 10`
    do
           if [ $(($i%2)) -eq 0 ];then
                   echo "偶数是$i"
           fi
    done
    
    1. seq start end 语句用来产生一个数字系列
    1. $[ num1 +num2 ] 语句用来进行基础的数学运算
    1. [[ … ]] 语句用更方便的进行比较判断
  1. C语言风格的for循环
for ((i=0;i<10;i++))
do
	echo "num is $i"
done

十一、函数

  1. 函数定义
    定义是 function 不是必须的,可以省略
function foo(){
	echo '-----------------------'
	echo "Hello $1,nice to meet you!"
	echo '-----------------------'
}
  1. 函数的使用
    • 在终端或者脚本中直接输入函数名即可,不需要小括号
    • 传参也只需将参数加到函数名后面,以空格做间隔,像正常使用命令那样
foo arg1 arg2 arg3 ...
  1. 函数的参数
bar(){
	echo "执行者是 $0"
	echo "参数数量是 $#"
	echo "全部的参数 $@"
}

十二、数组

数组中科院存放多个值。Bash Shell只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。与大部分编程语言类似,数组元素的下标由0开始。

  • 定义数组

Shell数组用括号来表示,元素用“空格”符号分割开,语法格式如下:

array_name=(value1 ... valuen)

示例:

arr=(hello good "yes" a 12)

同时;也可以直接使用下标来定义一个数组。

nums[0]=1
nums[1]="good"
nums[2]=yes
  • 获取和修改数组数据

使用下标可以直接修改数组里的数据。

names=(hello 12 34 good 8)
# 取出元素,需要使用{}
echo ${names[0]}
echo ${names[1]}

# * 和 @ 都能获取到所有的数据
echo ${names[*]}
echo ${names[@]}

# 获取数组的长度
echo ${#names[*]}
echo ${#names[@]}
  • 数组遍历
for n in ${name[*]} # 使用*或者@拿到所有元素
do
	echo $n
done

# C语言写法
for ((x=0;x<${#names[@]};x++))
do
	echo $x
done
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:41:37  更:2022-04-27 11:44:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:08:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码