SHELL 前言
什么是shell

 shell壳命令解释器,一种应用程序。
shell语言的特点SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称。Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。
Shell 能做什么?Shell 能做什么?
  1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略…)
  2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
  3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
  4. 日志分析处理程序(PV, UV, 200代码, !200代码, top 100, grep/awk)
  5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
  6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
  7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  9. 自动化扩容(增加云主机——>业务上线)
    zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
  10. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
  11. Shell可以做任何事(一切取决于业务需求)
    SHELL执行方式:
    shell多种执行方式
    准备测试脚本
    [root@localhost tmp]#vim file1
    echo “hello 2020”
    read -p “请输入您的姓名:” name
    echo “哈哈 $name 是大笨蛋”
    执行1:bash file1
    执行2:sh file1
    which bash
    which sh
    发现是同一个文件
    执行3:. file1
    执行4: source file1
    同理执行3
    多种执行方式的区别
    1和2的方式,是子shell
    3和4的方式,是本shell
    1.准备环境

vim bash.sh
#!/usr/bin/bash
cd /home/
ls

  1. 一种执行方式测试
    . bash.sh

3.观察目录改变了。说明影响的是当前。并使用子shell执行方式执行。
该种执行方式,是不同于前者SUB shell执行。
而是在当前shell执行,用于影响当前shell环境。
shell解释器在哪
cat /etc/shells

chsh -l
变量
简介
shell 变量? 用一个固定的字符串去表示不固定的内容,便于修改。
1. 自定义变量
简述
用户自定义变量是最常用的变量类型,其特点是变量名和变量值都是由用户自由定义的。
学习要点
定义变量: 变量名=变量值
引用变量: $变量名
或 ${变量名}
查看变量: echo KaTeX parse error: Expected 'EOF', got '#' at position 135: …ot@localhost ~]#̲ name="xulei 66…“符号。
那么最简单的变量调用就是通过 echo 命令输出变量的值。命令如下
#定义变量name
[root@localhost ~]# name=“xulei 666”
#输出变量name的值
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 73: …则,就会报错。比如: #̲变量名不能以数字开头 …aa"456
#调用变量aa,发现值已经变成了123456
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 18: … 123456 #̲在进行变量叠加时,也可以使用{变量名}格式
[root@localhost ~]# aa=${aa}789
[root@localhost ~]# echo $aa
123456789
这里要小心,在进行变量叠加时,变量名需要用双引号或 ${} 包含。
变量查看
我们可以通过 echo 命令查询已经设定的变量的值,这种查询是已知变量名查询变量值。
但是如果我不知道变量名,那么可以查询系统中已经存在的变量吗?
[root@localhost ~]# set
变量删除
要想删除自定义变量,可以使用 unset 命令。命令格式如下:
[root@localhost ~]# unset 变量名
这条命令执行之后,再查询变量,就会发现这个变量已经为空了。
[root@localhost ~]# unset name
[root@localhost ~]# echo $name
输出是空的
示例
使用变量前
需求
编写测试主机在线的脚本。当主机在线提示在线,当主机不在线提示不在线。
编写脚本
[root@localhost ~]vim ping.sh
ping -c1 192.168.100.10 &> /dev/null && echo 192.168.100.10up || echo 192.168.100.10down
注释
&&和||是三目表达式
&& 前面的命令成功。执行后面的命令
||前面的命令失败。执行后面的命令
授权脚本
[root@localhost ~]#chmod +x ping.sh
执行脚本
[root@localhost ~]#./ping.sh
思考
如果更换测试IP。需要修改脚本的哪些部分?
需要修改三个部分
使用变量后
编写脚本
[root@localhost ~]vim ping.sh
#!/bin/bash
ip=192.168.100.10
ping -c1 $ip &>/dev/null && echo i p u p ∣ ∣ e c h o " ip up || echo " ipup∣∣echo"ip down”
授权脚本
[root@localhost ~]# chmod +x ping.sh
执行脚本
[root@localhost ~]# ./ping.sh
思考
添加变量后,修改一处即可。
交互定义变量
read 从键盘读入变量值
赋值方式
read 变量名
示例
read -p “请输入您测试的IP地址:” ip

ping -c1 $ip &>/dev/null && echo " i p u p " ∣ ∣ e c h o " ip up" || echo " ipup"∣∣echo"ip
down"
注意事项:3种引号
定义或引用变量时注意事项:
" " 弱引用
’ ’ 强引用
优先执行
双引号1
[root@localhost ~]# schoo=1000 phone
错误示范,shell把空格识别做命令分隔符。
bash: phone: 未找到命令
[root@localhost ~]# schoo=“1000 phone”
正确示范,变量值中的空格,被转义为一个普通符号
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 71: …ot@localhost ~]#̲ schoo=schoo is good
错误示范,已有变量的基础上,再追加内容。
bash: is: 未找到命令
没有加引号,被识别为两条命令
[root@localhost ~]# schoo="$schoo is good"
正确示范,加了双引号。组成了整体,空格失去含义。
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 75: …ot@localhost ~]#̲ schoo='schoo 666’
单引号,转义一切符号
[root@localhost ~]# echo $schoo
$schoo 666
$也被转义了。一切都被转义了。
反引号
[root@localhost ~]# schoo=date
反引号是优先执行。先执行date的命令,再执行定义变量。
[root@localhost ~]# echo $schoo
2020年 05月 06日 星期三 14:57:13 CST
所以看到变量的结果,是时间
注意
变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
起变量名,请使用五个字母以上。
2. 整数运算
方法一:expr
语法
expr 1 + 2
expr $num1 + $num2
+加
-减
*乘(是任意字符,使用\ 转义一下。)
/除
%取余
案例
需求
运算学员的成绩总分
制作脚本
[root@localhost ~]# vim sum.sh
#!/bin/bash
read -p "请输入您的第一门成绩: " number1
read -p "请输入您的第二门成绩: " number2
echo -n "总成绩是: "
expr $number1 + KaTeX parse error: Expected 'EOF', got '#' at position 41: …ot@localhost ~]#̲ chmod +x sum.s…(())
语法
echo ( ( (( ((num1+$num2))
echo $((num1+num2))
echo $((5-3
2))
echo ( ( 2 ∗ ∗ 3 ) ) / / ( 蜜 ) 2 的 3 次 方 方 法 三 : ((2**3)) //(蜜)2的3次方 方法三: ((2∗∗3))//(蜜)2的3次方方法三:[]
语法
echo $[5+2] + - * / %
echo $[5**2]
方法四:let
示例
let sum=2+3; echo $sum
let i++; echo $i
3. 小数运算(了解)
请提前安装计算器程序bc
echo "24" |bc
echo “2^4” |bc
echo “scale=2;6/4” |bc
bc:交互运算器
scale=2 保留小数点后面两位
4. 环境变量(了解)
前言
自定义变量,只能再当前shell生效。其他shell是不生效的。
说白了,你的变量只能你用。那如果有些变量,需要所有的用户都使用用。
怎么办呢?
定义环境变量:
直接声明
方法一 export back_dir2=/home/backup
声明环境变量
转换声明
方法二 export back_dir1 将自定义变量转换成环境变量
转换环境变量
变量作用范围: 在当前shell和子shell有效
想使变量。在当前用户登陆后一直生效,可以将变量放到~/.bash_profile
想使变量。在所有用户登陆后一直生效,可以将变量放到/etc/profile
示例
[root@localhost ~]# abc=123
定义普通变量1
[root@localhost ~]# def=456
定义普通变量2
[root@localhost ~]# bash
打开子shell
[root@localhost ~]# echo $abc
调用普通变量,失败
[root@localhost ~]# echo $def
调用普通变量,失败
[root@localhost ~]# exit
退出子shell
exit
[root@localhost ~]# export abc
讲变量声明为环境变量。儿子shell都能用。
[root@localhost ~]# bash
打开子shell
[root@localhost ~]# echo $abc
发现变量可以用了。
123
[root@localhost ~]# echo $def
普通变量还是不行。
5. 位置变量和预定义变量(了解)
位置变量语法
位置变量
命令 参数1 参数2 参数3 …9以后特殊定义
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 …
示例
需求
制定脚本程序,用户自行输入两门学科的成绩(整数),自动算出平均分。
制作脚本
[root@localhost ~]# vim avg.sh
#!/bin/bash
echo “($1+KaTeX parse error: Expected 'EOF', got '#' at position 34: …ot@localhost ~]#̲ chmod +x …num1+$num2)/2” |bc
总结
1.位置变量就是$1,$2,$3,$4
2.位置变量预先已经被定义过了。
3.用户使用时,必须携带参数。
4.位置变量不是程序设计的唯一方法。比如read也可以。
预定义变量
$0 脚本名/程序名
$
所有的参数
$# 参数的个数
$? 上一个程序的返回值(0是成功,非零失败)
$$ 程序的PID
示例
定义脚本
[root@localhost ~]# vim avg.sh
#!/bin/bash
echo “($1+$2)/2” | bc
echo “该程序名为 0 " e c h o " 该 程 序 使 用 了 0" echo "该程序使用了 0"echo"该程序使用了# 个参数”
echo “该程序的参数如下: $*”
调用脚本
[root@localhost ~]# ./avg.sh 60 50
55
该程序名为./avg.sh
该程序使用了2 个参数
该程序的参数如下: 60 50
总结
这两类变量,在设计系统时就已经定义好了。
需要使用时,直接调用即可。
课后题
编写自动创建用户并设置初始密码的脚本。
#!/bin/bash

read -p "please input username: " name

useradd $name
echo “123456” | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 6: name &̲> /dev/null ech…name create finished,the password is 123456"
编写脚本,配置本地yum源
#!/bin/bash

mount /dev/cdrom /mnt &> /dev/null

rm -rf /etc/yum.repos.d/*

cat << EOF > /etc/yum.repos.d/yum.repo
[local]
name=localyum
baseurl=file:///mnt
enabled=1
gpgcheck=0
EOF

yum repolist all

Linux Shell编程及自动化运维实现 变量相关推荐

  1. linux 【完结篇】第六章 shell编程及自动化运维--三剑客

    linux 第六章 shell编程及自动化运维–三剑客 一.正则表达式 1.前言 名词解释: 正则表达式是一种字符模式,用于在查找过程中匹配指定的字符.在大多数程序里,正则表达式都被置于2个正斜杠之间 ...

  2. Linux集群和自动化运维

    Linux/Unix技术丛书 Linux集群和自动化运维 余洪春 著 图书在版编目(CIP)数据 Linux集群和自动化运维/余洪春著. -北京:机械工业出版社,2016.8 (Linux/Unix技 ...

  3. linux之AUTOMATION(自动化运维)二

    linux之AUTOMATION(自动化运维) 01: ansible基础 . Ansible ad-hoc 02: sudo提权 . Ansible配置 . Ansible Playbook . A ...

  4. linux shell 等待输入_linux运维——基础篇

    说到服务器操作系统,linux的各种发行版本以毫无悬念的姿态占领了绝大部分的市场份额.常见的桌面操作系统Windows与Linux在操作上有着很大的区别. 容器技术最初发源于linux,也成熟结果与L ...

  5. 释放linux缓存文件命令,Linux定时释放缓存Shell脚本实现自动化运维 | kTWO-个人博客...

    使用Linux服务器的用户应该都知道,Linux在使用的时候,可用内存会随着时间慢慢的变小,最终可能到80%-90%,这个时候就需要我们去人工干预,来进行魂村的释放. 本文将使用Linux的Cron定 ...

  6. Linux shell编程学习笔记-----第六章变量和引用

    6.1变量 变量可分为本地变量(随着shell进程的消亡而消亡,类似于java C++ 中的局部变量),环境变量(适用于所有由登录进程产生的子进程),位置参数(用于向shell脚本传递参数,是只读的) ...

  7. linux框架下搭建orl,DevOps和自动化运维实践/Linux\Unix技术丛书

    导语 内容提要 随着云计算.Docker.Kubernetes技术的流行,相信大家经常会听到"容器云"这个专业词汇,容器技术的兴起,对于传统的运维知识体系而言也是一种冲击和挑战.& ...

  8. python自动化运维与开发岗位_新课 | 运维开发工程师必学的Python自动化运维课程,学完后悔没早点学!...

    原标题:新课 | 运维开发工程师必学的Python自动化运维课程,学完后悔没早点学! 马哥教育2017年Python自动化开发实战班,根据目前企业需求的Python开发人才进行了深度定制,加入了大量一 ...

  9. linux运维脚本编写,最强Linux自动化运维 Shell高级脚本编程实战 带习题+项目实战案例+全套配置脚本...

    最强Linux自动化运维 Shell高级脚本编程实战 带习题+项目实战案例+全套配置脚本 大家可以通过参考下面的课程学习目录,就会发现单单只从目录上来分析就知道这是一部非常系统的Shell自动化脚本运 ...

最新文章

  1. Python五种常见的算法,你都了解么
  2. Linux-SFTP/SSH免密码,钥匙登录
  3. ESP32 flash容量配置
  4. [云炬创业基础笔记]第六章商业模式测试7
  5. 云炬Android开发笔记 2-2 Android studio项目上传到Github及无法连接Github的问题处理
  6. 错误信息 c语言实现_全国计算机等级考试二级C语言
  7. oracle locked timed,Oracle里面的用户smsdb无法登录 LOCKED(TIMED)
  8. 第 39 章 ThinkPHP--CURD 操作
  9. Linux C高级编程——文件操作之系统调用
  10. 浅谈时间函数gettimeofday的成本
  11. 编译支持iOS的libcurl+OpenSSL库(支持https IPv6)
  12. 马尔科夫决策过程(MDP) : BlackJack (MC-On Policy)
  13. 手机电脑自适应导航源码php,自适应各终端懒人网址导航源码 v2.4
  14. 推荐收藏:50个最佳机器学习公共数据集
  15. vue 下载本地文件
  16. 基于ECharts和腾讯疫情数据接口的全球疫情地图(超全)
  17. 使用excel导入功能时日期数据变成数字的解决
  18. 【CTA】CTA认证要求打开日历时提示联系人权限确认
  19. 解决windows10 无法开热点问题
  20. 21北邮计算机专硕与学硕科目,【21考研】研考必知!对考英语、数学、专硕、学硕、专科考研都有用!...

热门文章

  1. 基于SSM框架的微博系统
  2. ESP32反复重启报rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT) flash read err, 1000错误
  3. 深度学习--猫狗图像分类
  4. MySQL_Z11数据处理之增删改
  5. 动画css ---无限旋转
  6. 推荐一款工具类微信小程序,感兴趣的朋友可以看看
  7. oracle 在中国的合作伙伴名单(二)
  8. 手机html5卡,手机端js和html5刮刮卡效果
  9. 从离散到分布,盘点常见的文本表示方法
  10. Android 生成条形码 生成下方带文本的条形码