Linux云计算学习笔记day56

Stella981
• 阅读 472

shell编程

第一章

1.1 什么是shell?

Shell其实是一个命令解释器,作用是解释执行用户输入的命令以及程序等,用户每输入一条命令,Shell给予解释执行一条。这种键盘一输入命令,就可以立即得到回应的对话方式,称为交互模式。
Shell存在于操作系统的最外层,负责与用户直接对话。处理用户的输入,并将操作系统执行结果返回给用户。在用户登陆到操作系统之后的所有操作均由Shell解释执行。Shell在操作系统中所处的位置如下

Linux云计算学习笔记day56

image.png

1.2 什么是shell脚本?

简言之,如果shell命令通过写入到一个程序文件并执行的时候,此程序我们就称之为shell脚本。但是在生产环境中的Shell脚本不仅仅是这么简单,而是将一些命令、变量以及流程控制语句有机结合并生成的功能完善的强大的应用程序。举例说明:
清除/var/log下message日志文件简单脚本

cat /dev/null > /var/log/messages
reboot

生产环境中清除/var/log下message的脚本

!/bin/bash

清除日志脚本,版本 2

LOG_DIR=/var/log

脚本需要使用root用户权限来执行,因此,对当前用户进行判断,则不和要求的用户给出友好提示,并终止程序执行

ROOT_UID=0
if [ "ROOT_UID" ] # <== 如果当前用户不是root,则不允许执行脚本
then
echo "Must be root to run this script." # <== 给出提示后退出
exit 1
fi

如果切换目录不成功,则给出提示并中止程序执行

cd $LOG_DIR || {
echo "Cannot change to necessary directory."
exit 1
}

经过上述判断之后,此处的用户权限应该是对的了,只有清空成功,再能打印成功提示

cat /dev/null >messages &&{
echo "Logs cleaned up."
exit 0 # 返回0则成功
}
echo "Logs cleaned up fail."
exit 1 # 返回1则失败

1.3 什么时候使用shell脚本?

Linux批量管理
自动化完成系统优化
自动化安装Linux操作系统(kickstart和cobbler)
测试工具和内容自动化
邮件自动发送
服务自动重启
代码上线
定时备份和定时启停服务
Linux系统监控、服务监控、端口监控、IP黑名单监控、流量监控(脚本+zabbix)
服务的日志切割、存储备份、日志分析等等

1.4 如何学好shell脚本?

基础变量、条件表达式、流程判断、if、for循环、while循环、case语句、循环控制
从简单的判断和循环开始写
阅读、模仿、尝试从零开始写
写注释,将任务分解成一个个小任务,类似于打游戏闯关
找一本合适的教材,或者自己认真记笔记
多练习-思考-练习-思考,循环往复

1.5 解释型语言和编译型语言

1.5.1 编译型语言:
指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码,这个过程叫做编译。
编译好的可执行文件(.exe),可在相对应的平台运行(移植性差,但是效率高)。
C\C++.....

1.5.2 解释型语言:
用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言,相当于把编译型语言的编译执行过程混合在一起同时完成的。
编译型语言执行效率较低,切不能脱离解释器运行。但是跨平台比较容易,只需提供相应的解释器
shell\python

注:Java属于特殊的。既可以说成是解释型语言,又可以说成是编译型语言

shell是命令解释器
shell脚本是由命令组合成的一个可执行的文件
编译型语言和解释型语言

1.6 shell脚本建立和执行

1.6.1 解释器类型
bash是centos中的默认解释器
sh
1.6.2 脚本定义
脚本开头

!/bin/bash

1.6.3 父shell和子shell
脚本嵌套
父shell中的环境变量,在子shell中可以看到
而子shell中的变量,在父shell中看不到
1.6.4 shell执行方式
sh & bash,最常用的使用方式
cat *.sh | bash,适用于执行多个脚本
sh < oldboy.sh,了解一下,输入重定向
/root/oldboy.sh,需要执行权限
. oldboy.sh
source oldboy.sh

1.6.5 shell开发习惯

>脚本存放在固定目录
开头加脚本解释器信息
附带作者和版权信息
脚本中尽量不用中文
脚本扩展名用.sh
成对的符号一次性书写完成
注意缩进
养成写注释的良好习惯

总结:
脚本放在指定目录
创建脚本,后缀是.sh
在第一行顶格添加命令解释器的声明#!/bin/bash
添加作者时间和版权信息

养成良好习惯,添加注释
Centos7默认解释器是/bin/bash
退出当前shell的命令是:exit

第二章 变量基础

2.1 定义变量

值可变的量,称为变量
变量名=变量值,常说的变量,一般是变量名
字母数字下划线,不能是数字开头

2.2 环境变量和普通变量

2.2.1 环境变量(全局变量)

可在创建他们的shell以及派生出来的任意子shell中使用
环境变量包括内置的环境变量和自定义的环境变量,且通常为大写。
环境变量的定义方式:

declare -x 变量名=value
export 变量名=value

环境变量有四个文件,他们的执行顺序如下图所示:

Linux云计算学习笔记day56

image.png

登陆shell会加载所有的环境变量
非登陆shell可能会加载~/.bashrc或者/etc/bashrc(上图非绿色部分),然而有些定时任务以上两个根本不会加载,所以需要手动指定,建议在定义变量时定义到/etc/bashrc
可以在环境变量文件中定义普通变量

2.2.2 普通变量

>普通变量只有在当前shell下才能使用
 定义方式

适用于一般场景,不适用于带有空格等字符

变量名=value

所见即所得的定义方式

变量名=’value’

解析双引号之内的变量

变量名=”value”

注意点:(举例说明)

  1. 变量如果后面有内容,一定要把变量括{}起来
  2. 希望变量内容原样输出则加单引号
  3. 希望获取变量中的命令执行结果用``或者$()

1、定义环境变量的方式:
export 变量名=变量值
2、定义普通变量的方式:
变量名=变量值
3、定义变量的三种方式

适用于一般场景,不适用于带有空格等字符

[export] 变量名=value

所见即所得的定义方式

[export] 变量名=’value’

解析双引号之内的变量

[export] 变量名=”value”
4、环境变量文件的加载顺序
/etc/profile ===> ~/.bash_profile ===> ~/.bashrc ===> /etc/bashrc
5、非登录式(ssh)的shell只加载后两个

2.3 临时变量和永久变量(了解)

如果按照变量的生存周期来划分的话,Linux变量可以分为两类:
永久变量:需要修改变量配置文件,使得变量永久生效
临时变量,使用export命令或者直接在当前shell中赋值的变量

用source执行脚本和用bash执行的区别是什么
答案:用source执行的脚本,变量会在父shell下生效,用. 也是
用bash执行的脚本,变量不会在父shell下生效
如何自定义环境变量
定义变量内容,不加引号、单引号、双引号、反引号结果有什么不同?该怎么用
反引号:强制命令解析
在shell编程中,如果要访问变量值,可以变量前加一个__FRUTT=apple B)显示变量的值:fruit=apple C)显示变量的值:echo $FRUTT

2.4 shell特殊变量

2.4.1 参数特殊变量

Linux云计算学习笔记day56

image.png

2.4.2 进程特殊变量

Linux云计算学习笔记day56

image.png

2.5 shell变量子串

Linux云计算学习笔记day56

image.png

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这