diff --git a/Shell-MD/初始shell.md b/Shell-MD/初始shell.md new file mode 100644 index 0000000..9480b9f --- /dev/null +++ b/Shell-MD/初始shell.md @@ -0,0 +1,289 @@ +

初始Shell

+ +作者:行癫(盗版必究) + +------ + +## 一:Shell概述 + +#### 1.计算机编程语言 + +​ 计算机编程语言是程序设计的最重要的工具,它是指计算机能够接受和处理的、具有一定语法规则的语言 + +阶段: + +​ 机器语言 + +​ 机器语言是用二进制代码表示的、计算机能直接识别和执行的一种机器指令的集合,第一代计算机语言 + +​ 汇编语言 + +​ 用与代码指令实际含义相近的英文缩写词、字母和数字等符号来取代指令代码 + +​ 高级语言 + +​ 自然语言相近并为计算机所接受和执行的计算机语言称高级语言;独立于机器面向过程或对象的语言 + +分类: + +​ 命令式语言 + +​ C、C++、Basic、Ada、Java、C#、Shell、Python等,各种脚本语言也被看作是此种类型 + +​ 函数式语言 + +​ 基于数学函数概念的值映射的λ算子可计算模型;Lisp、Haskell、ML、Scheme 、F#等 + +​ 逻辑式语言 + +​ 基于一组已知规则的形式逻辑系统;最著名的逻辑式语言是 Prolog + +​ 面向对象语言 + +​ 现代语言中的大多数都提供面向对象的支持,纯面向对象语言是 Smalltalk + +编译型和解释型语言: + +​ 解释型 + +​ 解释性语言编写的程序不进行预先编译,以文本方式存储程序代码 + +​ 执行时才翻译执行 + +​ 程序每执行一次就要翻译一遍 + +​ 代表语言:python,JavaScript,Shell等 + +​ 优缺点:跨平台能力强,易于调,执行速度慢 + +image-20230405123821400 + +​ 编译型 + +​ 编译型语言在执行之前要先经过编译过程,编译成为一个可执行的机器语言的文件 + +​ 因为翻译只做一遍,以后都不需要翻译,所以执行效率高 + +​ 典型代表:C语言,C++ + +​ 优缺点:执行效率高,缺点是跨平台能力弱,不便调试 + +#### 2.shell能做什么 + +​ 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...) + +​ 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx) + +​ 应用管理程序(KVM,集群管理扩容,MySQL,DELLR720批量RAID) + +​ 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk) + +​ 自动化备份恢复程序(MySQL完全备份/增量 + Crond) + +​ 自动化管理程序(批量远程修改密码,软件升级,配置更新) + +​ 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL) + +​ 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL) + +​ 自动化扩容(增加云主机——>业务上线) + +​ Shell可以做任何事(一切取决于业务需求) + +#### 3.shell定义 + +​ Shell 是命令解释器,用于与操作系统交互,用来完成各种任务,如文件操作、系统管理、网络管理等 + +​ Shell 是一种程序设计语言,他有变量,有自己的语法结构等,shell程序设计语言可以编写功能很强、代码简短的程序 + +#### 4.获取当前支持的Shell + +```shell +[root@xingdiancloud ~]# cat /etc/shells +/bin/sh +/bin/bash +/usr/bin/sh +/usr/bin/bash +/bin/tcsh +/bin/csh +[root@xingdiancloud ~]# chsh -l +/bin/sh +/bin/bash +/usr/bin/sh +/usr/bin/bash +/bin/tcsh +/bin/csh +``` + +​ strem9: + +```shell +[root@xingdiancloud ~]# cat /etc/shells +/bin/sh +/bin/bash +/usr/bin/sh +/usr/bin/bash +``` + +## 二.GUN Bash特性 + +#### 1.命令和文件自动补齐 + +​ 下载bash-completion 补全工具 + +```shell +[root@xingdiancloud ~]# yum install bash-completion -y +``` + +#### 2.命令历史记忆功能 + +​ 上下键调用历史命令 + +​ 获取历史命令的命令:history + +​ 获取某一条历史命令:!number 直接执行对应序号的命令 + +​ 快捷键调用历史命令:Ctrl+r 输入关键字调出之前的命令 + +#### 3.快捷键 + +​ Ctrl+a 切换到命令行开始 + +​ Ctrl+e 切换到命令行末尾 + +​ Ctrl+u 清除剪切光标之前的内容 + +​ Ctrl+k 清除剪切光标之后的内容 + +​ Ctrl+y 粘贴刚才锁删除的字符 + +​ Ctrl+左右键 快速移动光标 + +#### 4.前后台作业控制 + +​ &:后台运行 + +​ nohup:正在运行一个进程,退出帐户时该进程不会结束 + +​ ^C:终止 + +​ ^Z:暂停 + +​ jobs:查看后台进行 + +​ bg %工作号:将一个在后台暂停的命令,变成继续执行 + +​ fg %工作号:将后台中的命令调至前台继续运行 + +案例: + +```shell +[root@xingdiancloud ~]# sleep 1000 & +[1] 7761 +[root@xingdiancloud ~]# jobs +[1]+ Running sleep 1000 & +[root@xingdiancloud ~]# jobs +[1]+ Running sleep 1000 & +[root@xingdiancloud ~]# kill -19 %1 + +[1]+ Stopped sleep 1000 +[root@xingdiancloud ~]# jobs +[1]+ Stopped sleep 1000 +[root@xingdiancloud ~]# bg %1 +[1]+ sleep 1000 & +``` + +#### 5.输入输出重定向 + +```shell +0,1,2 > >> 2> 2>> 2>&1 &> cat < /etc/hosts cat < /proc/self/fd/2 +lrwxrwxrwx 1 root root 15 Sep 1 2015 /dev/stdin -> /proc/self/fd/0 +lrwxrwxrwx 1 root root 15 Sep 1 2015 /dev/stdout -> /proc/self/fd/1 +``` + +#### 6.管道 + +```shell +[root@xingdiancloud ~]# ip addr |grep 'inet ' |grep eth0 +[root@xingdiancloud ~]# ip addr |grep 'inet ' |tee test |grep eth0 覆盖 +[root@xingdiancloud ~]# ip addr |grep 'inet ' |tee -a test |grep eth0 -a 追加 +``` + +#### 7.命令排序 + +​ ; 无论前面是否执行成功,分号后的命令都会继续执行 + +​ && 前面执行成功,后面的才继续执行 + +​ || 前面命令不成功,后面的命令也会继续 + +```shell +[root@xingdiancloud ~]# ./configure && make && make install (命令返回值 echo $?) +[root@xingdiancloud ~]# mkdir /var/111/222/333 && echo ok +[root@xingdiancloud ~]# mkdir -p /var/111/222/333 && echo ok +[root@xingdiancloud ~]# ls /home/111/222/333/444 || mkdir -p /home/111/222/333/444 +``` + +#### 8.shell通配符 + +​ * 匹配任意多个字符 ls in* + +​ ? 匹配任意一个字符 ll l?ve + +​ [] 匹配括号中任意一个字符 [a-z] + +​ () 在子shell中执行 (umask 077; touch file1000) + +​ {} 集合 touch file{1..9} + +​ \ 转义符,让元字符回归本意 + +```shell +[root@xingdiancloud ~]# echo * +[root@xingdiancloud ~]# echo \* +[root@xingdiancloud ~]# touch xing\ dian +``` + +## 三:编写脚本 + +​ 创建bash脚本: 以.sh结尾的文件 .py结尾的文件是python的脚本 + +#### 1.创建脚本文件 + +```shell +#!/bin/bash #!/usr/bin/env bash +指定命令解释器:第一行的专门解释命令解释器 +注释 :以#开有的都不生效 +编写bash指令集合 +``` + +```shell +#!/bin/bash +#注释 +#author:blackmed +#version:0.1 +#功能 +``` + +#### 2.修改权限 + +​ 注意:改不改权限都可以执行 + +```shell +[root@xingdiancloud ~]#./scripts +[root@xingdiancloud ~]#/shelldoc/scripts +[root@xingdiancloud ~]#bash scripts +``` + +## 四:脚本调试 + +​ sh –x script 这将执行该脚本并显示所有变量的值 + +​ sh –n script 不执行脚本只是检查语法模式,将返回所有错误语法 + +​ sh –v script 执行脚本前把脚本内容显示在屏幕上 diff --git a/Shell-MD/流程控制.md b/Shell-MD/流程控制.md new file mode 100644 index 0000000..94e4309 --- /dev/null +++ b/Shell-MD/流程控制.md @@ -0,0 +1,550 @@ +

流程控制

+ +作者:行癫(盗版必究) + +------ + +## 一:条件测试 + +#### 1.语法格式 + +```shell +格式1: test 条件表达式 +格式2: [ 条件表达式 ] +格式3: [[ 条件表达式 ]] +``` + +#### 2.文件测试 + +```shell +[ -e dir|file ] +[ -d dir ] +[ -f file ] 是否存在,而且是文件 +[ -r file ] 当前用户对该文件是否有读权限 +[ -x file ] +[ -w file ] +``` + +案例 + +```shell +[root@xingdian ~]# test -d /home +[root@xingdian ~]# echo $? +0 +[root@xingdian ~]# test -d /home11111 +[root@xingdian ~]# echo $? +1 +[root@xingdian ~]# [ -d /home ] +[root@xingdian ~]# [ ! -d /ccc ] && mkdir /ccc +[root@xingdian ~]# [ -d /ccc ] || mkdir /ccc +``` + +#### 3.数值比较 + +```shell +[ 1 -gt 10 ] 大于 +[ 1 -lt 10 ] 小于 +[ 1 -eq 10 ] 等于 +[ 1 -ne 10 ] 不等于 +[ 1 -ge 10 ] 大于等于 +[ 1 -le 10 ] 小于等于 +``` + +案例 + +```shell +[root@xingdian ~]# disk_use=$(df -P |grep '/$' |awk '{print $5}' |awk -F% '{print $1}') +[root@xingdian ~]# [ $disk_use -gt 90 ] && echo "war......" +[root@xingdian ~]# [ $disk_use -gt 60 ] && echo "war......" +``` + +```shell +[root@xingdian ~]# [ $(id -u) -eq 0 ] && echo "当前是超级用户" +当前是超级用户 +[alice@xingdian ~]$ [ $UID -eq 0 ] && echo "当前是超级用户" || echo "you不是超级用户" +you不是超级用户 +``` + +#### 4.字符串比较 + +```shell +提示:使用双引号 +[root@xingdian ~]# [ "$USER" = "root" ];echo $? +0 +[root@xingdian ~]# [ "$USER" == "root" ];echo $? +0 +``` + +注意: + +```shell +"":弱引用,可以实现变量和命令的替换 +[root@xingdian ~]# x=* +[root@xingdian ~]# echo "$x" +* +'':强引用,不完成变量替换 +[root@xingdian ~]# x=* +[root@xingdian ~]# echo '$x' + $x +``` + +#### 5.扩展 + +```shell +[root@xingdian ~]# var1=111 +[root@xingdian ~]# var2= +[root@xingdian ~]# //var3变量没有定义 +[root@xingdian ~]# echo ${#var1} #显示变量中字符串的个数 +3 +[root@xingdian ~]# echo ${#var2} +0 +[root@xingdian ~]# echo ${#var3} +0 +[root@xingdian ~]# [ -z "$var1" ];echo $? //-z 变量字符串为空 +1 +[root@xingdian ~]# [ -z "$var2" ];echo $? +0 +[root@xingdian ~]# [ -z "$var3" ];echo $? +0 +[root@xingdian ~]# [ -n "$var1" ];echo $? //-n 变量字符串不为空 +0 +[root@xingdian ~]# [ -n "$var2" ];echo $? +1 +[root@xingdian ~]# [ -n "$var3" ];echo $? +1 +``` + +案例: + +```shell +[root@xingdian ~]# [ "$USER" = "root" ];echo $? +0 +[root@xingdian ~]# [ "$USER" = "alice" ];echo $? +1 +[root@xingdian ~]# [ "$USER" != "alice" ];echo $? +0 +[root@xingdian ~]# [ 1 -lt 2 -a 5 -gt 10 ];echo $? +1 +[root@xingdian ~]# [ 1 -lt 2 -o 5 -gt 10 ];echo $? +0 +[root@xingdian ~]# [[ 1 -lt 2 && 5 -gt 10 ]];echo $? +1 +[root@xingdian ~]# [[ 1 -lt 2 || 5 -gt 10 ]];echo $? +0 +[root@xingdian ~]# [ "$USER" = "root" ];echo $? +0 +``` + +## 二:条件判断 + +#### 1.流程控制 + +​ 在一个shell脚本中的命令执行顺序称作脚本的流;大多数脚本会根据一个或多个条件来改变它们的流 + +​ 流控制命令:能让脚本的流根据条件而改变的命令称为条件流控制命令 + +​ exit语句:退出程序的执行,并返回一个返回码,返回码为0正常退出,非0为非正常退出 + +​ 条件判断:if代码返回0表示真,非0为假 + +#### 2.语法结构 + +单分支结构 + +```shell +if 条件测试 +then 命令序列 +fi +``` + +双分支结构 + +```shell +if 条件测试 +then 命令序列 +else 命令序列 +fi +``` + +多分支结构 + +```shell +if 条件测试1 +then 命令序列 + +[elif 条件测试2 +then 命令序列 + +elif 条件测试3 +then 命令序列]... + +else 命令序列 +fi +``` + +案例 + +```shell +if [ "$USER" = "root" ] + then + if [ $UID -eq 0 ] + then + echo "the user is root" + fi + + elif + echo "……" + elif + echo "……" + else + echo "the user is not root" + echo "正在给用户授权" + +fi +``` + +## 三:循环结构 + +#### 1.for循环 + +##### 语法结构 + +```shell +for i in (取值) 范围{1..20} zhangsan lisi wanger mazi ${array[*]} +for 变量名 [ in 取值列表 ] +do + 循环体 +done +``` + +##### 案例一 + +```shell +#!/bin/bash +# ping主机测试 +for i in {70..100} +do + ping -c1 10.30.161.$i &> /dev/null + if [ $? -eq 0 ] + then + echo "10.30.161.$i is up" |tee -a ipup.txt + else + echo "10.30.161.$i is down" |tee -a ipdown.txt + fi + +done +``` + +##### 案例二 + +```shell +#!/usr/bin/env bash +#批量添加账户 +for i in {30..40} +do + useradd user$i && echo "123" | passwd --stdin user$i &>/dev/null + if [ $? -eq 0 ];then + echo "账户 user$i 添加成功" + else + echo "账户 user$i 添加失败" + fi +done +``` + +##### 案例三 + +```shell +#!/usr/bin/env bash +#批量删除账户 +for i in {20..30} +do +userdel -r user$i &>/dev/null +[ $? -eq 0 ] && echo "账户 user$i 删除成功" || echo "账户 user$i 删除失败" +done +``` + +#### 2.while循环 + +​ 不断重复的执行循环体中的语句,直到某个条件成立 + +​ 循环次数不一定是固定的 + +##### 语法结构 + +​ 当条件测试成立(条件测试为真),执行循环体 + +``` +while 条件测试 +do + 循环体 +done +``` + +##### 案例 + +```shell +echo "please enter a number between 5 and 10 :" +read var +while [[ $var != 0 ]] +do + + if [ "$var" -lt 5 ] + then + echo "Too smail , Try again" + read var + elif [ "$var" -gt 10 ] + then + echo "Too big , Try again" + read var + else + echo "Congratulation! You are right." + exit 0; + fi +done +``` + +#### 3.until循环 + +​ 当条件测试成立(条件测试为假),执行循环体 + +##### 语法结构 + +```shell +until 条件测试 +do + 循环体 +done +``` + +##### 案例 + +```shell +#!/bin/bash +i=1 +until [ "$i" -eq 21 ] +do + userdel -r user$i + let i++ +done +``` + +## 四:匹配模式 + +#### 1.语法模式 + +```shell +read -p "请输入你的选项:" num +case num in +1) 选项 + 命令序列1 命令/if语句/for循环…… + ;; +模式2) + 命令序列2 + ;; +模式3) + 命令序列3 + ;; +*) + 无匹配后命令序列 +esac +``` + +##### 案例一 + +​ 确定要继续删除吗 yes/no: " yes + +##### 案例二 + +​ 系统管理工具箱 + +```shell +Command action + h 显示命令帮助 + f 显示磁盘分区 + d 显示磁盘挂载 + m 查看内存使用 + u 查看系统负载 + q 退出程序 +Command (h for help): m + total used free shared buffers cached +Mem: 7628 840 6788 0 29 378 +Swap: 2047 0 2047 +``` + +#### 2.工具箱 + +```shell +#!/usr/bin/env bash + +cat <<-EOF ++-------------------------------------------------------------------------+ +| System_tools V1.0 | ++-------------------------------------------------------------------------+ +| a. Stop And Disabled Firewalld. | +| b. Disabled SELinux Secure System. | +| c. Install Apache Service. | +| d. Quit | ++-------------------------------------------------------------------------+ +EOF +printf "\e[1;31m Please input your select: \e[0m" && read var + +case "$var" in + "a") + systemctl stop firewalld && systemctl disable firewalld + ;; + "b") + sed -ri s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config + ;; + "c") + yum -y install httpd httpd-tools + ;; + "d") + exit + ;; + *) + printf "请按照上方提供的选项输入!!!\n" + ;; +esac +``` + +## 五:循环控制 + +#### 1.break + +​ 关键字用于跳出循环,执行循环后面的语句 + +案例 + +```shell +for i in {1..10} +do + if [ $i -eq 5 ] + then + break + fi + echo $i +done +# 输出结果为: +# 1 +# 2 +# 3 +# 4 +``` + +#### 2.continue + +​ 跳过当前循环中的剩余语句,直接进入下一次循环 + +案例 + +```shell +for i in {1..10} +do + if [ $i -eq 5 ] + then + continue + fi + echo $i +done +# 输出结果为: +# 1 +# 2 +# 3 +# 4 +# 6 +# 7 +# 8 +# 9 +# 10 +``` + +#### 3.sleep + +​ sleep 10 等待10秒,再继续下一操作 + +## 六:格式化打印 + +​ printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等 + +#### 1.语法格式 + +```shell +[root@xingdiancloud ~]# printf format-string [arguments...] +• format-string: 为格式控制字符串 +• arguments: 为参数列表 +``` + +```shell +[root@xingdiancloud ~]# echo "Hello, Shell" +Hello, Shell + +[root@xingdiancloud ~]# printf "Hello, Shell" + +[root@xingdiancloud ~]# printf "Hello, Shell\n" +Hello, Shell +``` + +#### 2.案例 + +```shell +#!/bin/bash +printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg +printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234 +printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543 +printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 +``` + +#### 3.参数解释 + +%s 字符串 + +%f 小数 + +%d 数字 + +%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐) + +%-4.2f 指格式化为小数,其中.2指保留2位小数 + +\f 换页 + +\n 换行 + +\r 回车 + +## 七:颜色 + +​ shell脚本中echo显示内容带颜色显示,需要使用到-e参数 + +#### 1.语法格式 + +```shell +格式1:echo -e "\033[背景颜色;字体颜色m 要输出的字符 \033[0m" +格式2:echo -e "\e[背景颜色;字体颜色m 要输出的字符 \e[0m" +``` + +#### 2.案例 + +```shell +echo -e “\033[30m 黑色字 \033[0m” +echo -e “\033[31m 红色字 \033[0m” +echo -e “\033[32m 绿色字 \033[0m” +echo -e “\033[33m 黄色字 \033[0m” +echo -e “\033[34m 蓝色字 \033[0m” +echo -e “\033[35m 紫色字 \033[0m” +echo -e “\033[36m 天蓝字 \033[0m” +echo -e “\033[37m 白色字 \033[0m” +echo -e “\033[40;37m 黑底白字 \033[0m” +echo -e “\033[41;37m 红底白字 \033[0m” +echo -e “\033[42;37m 绿底白字 \033[0m” +echo -e “\033[43;37m 黄底白字 \033[0m” +echo -e “\033[44;37m 蓝底白字 \033[0m” +echo -e “\033[45;37m 紫底白字 \033[0m” +echo -e “\033[46;37m 天蓝底白字 \033[0m” +echo -e “\033[47;30m 白底黑字 \033[0m” + +控制选项: +\033[0m:关闭所有属性 +\033[1m:高亮显示,加粗 +\033[5m:闪烁 +```