shell编程之基础

shell基础

编程与编程语言

​ 编程的目的:

#计算机的发明,是为了用机器取代/解放人力,而编程的目的则是将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑/电脑一样自动执行的效果。

​ 什么是编程语言?

#上面提及的能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质。在编程的世界里,计算机更像是人的奴隶,人类编程的目的就命令奴隶去工作。

什么是编程?

#编程即程序员根据需求把自己的思想流程按照某种编程语言的语法风格编写下来,产出的结果就是包含一堆字符的文件。

#强调:程序在未运行前跟普通文件无异,只有程序在运行时,文件内所写的字符才有特定的语法意义  

什么是程序?

#编程的结果就是程序,更准确点说,程序就是一系列代码文件

​ 什么是进程?

#程序运行的过程就是进程,或者说是操作系统干活的过程,即操作系统拿着硬件去运行程序的过程

​ 编程的步骤?

1、先把自己想让计算机做事的步骤想清楚
2、再用一种计算机可以听懂的语言把做事的步骤翻译下来

编程的语言的发展历程

# 机器语言:站在计算机(奴隶)的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件;
#         优点:执行效率最高
#         缺点:1、二进制指令难以记忆,开发时极容易出错
#              2、开发程序的复杂度高:即便是完成一个简单的功能,需要用到的二进制指令的条数都会非常多

# 汇编语言:站在计算机(奴隶)的角度,简写的英文标识符取代二进制指令去编写程序,本质仍然是直接操作硬件;
#         优点:解决了机器语言的二进制指令难以记忆的问题,执行效率还是高
#         缺点:开发程序的复杂度依然很高:因为汇编语言就是用英文标签对应原来的二进制指令,好记归好记,开发的复杂度却没有降低

ps:因为上述两类语言都是在直接与计算机硬件打交道,离计算机硬件比较近,所以又统称为低级语言

# 高级语言:站在人(奴隶主)的角度,说人话,即用人类的字符去编写程序,屏蔽了硬件操作
#         优点:开发复杂度地,即开发效率高
#         缺点:速度肯定是不如低级语言,一直到今天,对速度要求极高的场景还会用到低级语言,比如操作系统的调度程序

高级语言分为

# 1. 编译型(需要编译器,相当于用谷歌翻译):如C,执行速度快,调试麻烦
编译型(c语言,go语言):程序写好之后直接进入类似于谷歌这样的浏览器进行翻译来执行
优点:程序运行过程中的效率高于解释型
缺点:代码出现bug时,程序调试过程非常麻烦
# 2. 解释型(需要解释器,相当于同声传译):如python,执行速度慢,调试方便
解释型(python,shell):需要安装解释器,通过交互式环境进行程序的编写与执行
优点:写程序的过程中,在交互式环境下,调试非常方便,写代码的效率高。
缺点:程序运行过程中,每一行代码都需要通过解释器进行翻译来执行,代码的执行效率低于编译型

shell介绍

shell是什么   命令解释器------》Linux操作系统系统接口之上运行的一个应用软件叫shell解释器

# 1、一层指的是shell这门语言,是一种特定的语法风格,规范等

# 2、另外一层指的是专门用于解释执行shell这门语言语法的应用程序,即shell解释器,我们常用的是bash

在这里插入图片描述

shell本身就是一门解释型、弱类型、动态语言,与python相对应,Python属于解释型、强类型、动态语言,我们平时登录成功一个用户后进入的就是bash解释器的交互式环境,我们敲的命令其实都属于shell这门语言的语法
在这里插入图片描述

为何要用shall -----一些日常的运维工作自动化

- 自动备份
- 自动部署
- 监控脚本

计算机完整体系结构图

在这里插入图片描述

运行shell程序的两种方式

#1.交互式环境

优点:代码运行的即时性,方便代码的调试
缺点:无法永久保存代码

#2.把shell命令写入文件中,该文件称之为脚本文件,保存后的文件直接存放于硬盘中,可以永久保存代码

其实我们在交互式环境里敲的命令直接放到一个文本文件里,一个简单的shell程序就完成了


#运行shell脚本经历的三个阶段:
(1)先启动shell解释器
(2)bash解释器会将脚本文件的内容从硬盘读入内存
(3)shell解释器会按照shell的语法解读并且执行代码文件的内容

变量

#什么是变量?

量:指的是事物的状态
变:是指是事物的状态是可以改变的
变量:是指将事物的状态记录下来,并且记录的数据是可改变的

变量是一种存储内存的机制

#为什么要用变量?

为了让计算机像人一样可以记录事物的状态,并且记录的数据是可改变的,记不是目的,目的是为了以后取出来用
程序=数据+功能,
程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序执行时状态以及状态的变化。

#如何用变量?

先定义(先把变量存起来)
后引用
变量名 = “变量值”(不加引号的是变量名,加了引号就变成变量值了)(“=”称为为赋值符号)(变量值就是事物记录的状态,也就是内存里面存放的数据)


#变量的三大组成部分
变量名:用来访问到变量值的
赋值符号:将变量值的内存地址绑定给变量名
变量值:即我们存的数据

#变量名的命名规则:字母数字下划线组成
变量名的第一个字符不能是数字,这样的命名被认为是不合法的

变量的使用

# 1、语法:变量名=值
# 2、注意:等号左右两边不能有空格!!!
# 3、例如:
[root@localhost ]# name="egon"


[root@localhost ]# ip="192.168.100.100"
[root@localhost ]# echo $ip
192.168.100.100

注意:如果是打印百分比,建议使用${变量名}%
[root@localhost ]# percent=90
[root@localhost ]# echo ${percent}%
90%

删除变量

[root@localhost ]# x=111
[root@localhost ]# unset x
[root@localhost ]# echo $x
[root@localhost ]# 

引号对变量的影响

双引号:软引用,引号符号有特殊意义

[root@web09 ~]# name="egon"
[root@web09 ~]# echo "hello $name"
hello egon

单引号:硬引用,引号所有符号均无特殊意义

[root@web09 ~]# echo 'hello $name'
hello $name

反引号:取命令的运行结果

[root@www ~]# name="egon"
[root@www ~]# 
[root@www ~]# echo "hello $name"
hello egon
[root@www ~]# echo 'hello $name'
hello $name
[root@www ~]# 
[root@www ~]# date +%F
2021-04-09
[root@www ~]# x=`date +%F`
[root@www ~]# touch ${x}.txt

[root@www ~]# y=$(date +%F)
[root@www ~]# touch ${y}.bak
[root@www ~]# ls
2021-04-09.bak  anaconda-ks.cfg  baidu.html  etc.tar.gz  nginx_install.txt  系统优化.md
2021-04-09.txt  a.txt            dir         index.html  web.log
[root@www ~]# tar czf `date +%F`.tar.gz /opt/
tar: Removing leading `/' from member names
[root@www ~]# ls
2021-04-09.bak     2021-04-09.txt   a.txt       dir         index.html         web.log
2021-04-09.tar.gz  anaconda-ks.cfg  baidu.html  etc.tar.gz  nginx_install.txt  系统优化.md
[root@www ~]# 

变量作用域

环境变量:在当前shell及子shell生效

自定义变量:仅在当前shell生效

[root@web09 ~]# x=1
[root@web09 ~]# export x
[root@web09 ~]# bash
[root@web09 ~]# echo $x
1

set查看所有变量(包括自定义变量和环境变量)env查看环境变量

环境变量

export x=111
#想要永久生效写到环境变量里 
vim /etc/profile.d/oldboy.sh

#小细节:这里写环境变量的时候,尽量将环境变量给写到/etc/profile.d/*.sh中,从而降低出错风险,万一你自己手抖更改了/etc/profile里面的文件,你整个环境变量可能就崩了。

#在profile里面有这一行文件
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done
#它在登录启动的时候会自动运行在/etc/profile.d/下所有*.sh的文件,所以写这里会安全的很多。

系统环境变量配置文件:

1./etc/profifile
2./etc/bashrc
3.~/.bashrc
4.~/.bash_profifile

元字符

# shell语法中的特殊字符

``$():取命令的结果
[root@web09 ~]# echo `pwd`
/root
[root@web09 ~]# echo $(pwd)
/root

$()可以嵌套,而``不能嵌套
[root@web09 ~]# echo $(ls $(pwd))
1.sh 2021-04-09.tar.gz 2021-04-09.txt 

~   家目录
!  取反
.. 上一级
@ 无特殊意义
# 无特殊意义
$ 取变量值
%、-、+运算符
^ 同!一样
* 任意多个字符
\ 转义特殊字符
| 管道:把一个进程处理的结果传递给另一个进程
= 赋值
()在子shall中执行
_ 下划线:无特殊意义,用于名字的声明
& 后台运行
/ 路径分隔符
{} 包含
>>输出重定向
<<输入重定向
>覆盖
>>追加
;&&||连接多条命令
?任意一个字符
[] 范围中的任意一个字符

%、-、+运算符

#整形运算用expr
[root@web09 ~]# expr 1 - 1
0
[root@web09 ~]# expr 1 + 3
4
[root@web09 ~]# expr 40 / 5
8
[root@web09 ~]# expr 10 % 3    #取余数
1

#浮点型运算结合bc
[root@web09 ~]# res=`echo 10 / 3 | bc`
[root@web09 ~]# echo $res
3
[root@web09 ~]# res=`echo "scale=2; 10 / 3" | bc` #指定小数位数
[root@web09 ~]# echo $res
3.33

{} 包含

#创建文件时
[root@tencent_cloud test]# touch {1..9}.txt
[root@tencent_cloud test]# touch {a..e}.txt
[root@tencent_cloud test]# ls
1.txt  3.txt  5.txt  7.txt  9.txt  b.txt  d.txt
2.txt  4.txt  6.txt  8.txt  a.txt  c.txt  e.txt

#取变量值
[root@tencent_cloud ~]# money=100	#定义money=100
[root@tencent_cloud ~]# echo $money$	#后面加符号,不会影响
100$
[root@tencent_cloud ~]# echo $moneyRMB	
#这样的话shell会误以为是$moneyRMB这个变量,所以要取值的话要用下面的方法

[root@tencent_cloud ~]# echo ${money}RMB

重定向

>>输出重定向
<<输入重定向
>覆盖
>>追加
[root@tencent_cloud test]# cat 1.txt
[root@tencent_cloud test]# cat >1.txt<<EOF
> hahaha
> ni chi shi ba 
> EOF
[root@tencent_cloud test]# cat 1.txt 
hahaha
ni chi shi ba

;与&&与||连接多条命令

#; 无论是否成功,都会运行后面的命令
[root@tencent_cloud test]# hahaha;ls
-bash: hahaha: command not found
1.txt  3.txt  5.txt  7.txt  9.txt  b.txt  d.txt
2.txt  4.txt  6.txt  8.txt  a.txt  c.txt  e.txt

#&& 只有前面的成功,才会运行后面的
[root@tencent_cloud test]# hahaha && ls
-bash: hahaha: command not found

[root@web01 test]# name="egon"
[root@web01 test]# [ $name = "egon" ] && [ $password = "123" ]
-bash: [: =: unary operator expected
[root@web01 test]# password="123"
[root@web01 test]# [ $name = "egon" ] && [ $password = "123" ]
[root@web01 test]# echo $?
0

#|| 前面的运行不成功才会去运行后面的命令
[root@tencent_cloud test]# hahaha || ls
-bash: hahaha: command not found
1.txt  3.txt  5.txt  7.txt  9.txt  b.txt  d.txt
2.txt  4.txt  6.txt  8.txt  a.txt  c.txt  e.txt

[root@tencent_cloud test]# cat 1.txt || ls	#运行成功,后面没有执行
[root@tencent_cloud test]# 

[root@web01 test]# [ $name = "egonxxx" ] || [ $password = "123" ]
[root@web01 test]# echo $?
0
[root@web01 test]# [ $name = "egonxxx" ] || [ $password = "123xxx" ]
[root@web01 test]# echo $?
1

?任意一个字符

[root@tencent_cloud test]# touch a{1..3}c.txt
[root@tencent_cloud test]# touch a{1..3}d.txt
[root@tencent_cloud test]# ls
a1c.txt  a1d.txt  a2c.txt  a2d.txt  a3c.txt  a3d.txt
[root@tencent_cloud test]# ls a?c.txt
a1c.txt  a2c.txt  a3c.txt
[root@tencent_cloud test]# ls a*.txt
a1c.txt  a1d.txt  a2c.txt  a2d.txt  a3c.txt  a3d.tx

运行shell脚本程序两种方式

绝对路径
# 权限:
# 1、对沿途文件夹有x权限
# 2、对目标文件有r和x权限

# 例
[root@egon ~~]# ll -d /a
d--------x. 3 root root 15 11月 15 11:05 /a
[root@egon ~~]# ll -d /a/b
d--------x. 2 root root 18 11月 15 11:06 /a/b
[root@egon ~~]# ll /a/b/hello.sh
-rw-r--r-x. 1 root root 10 11月 15 11:06 /a/b/hello.sh
[root@egon ~~]# su - egon
[egon@egon ~~]$ /a/b/hello.sh
hello world!

相对路径
[root@egon ~~]# ll -d /a
d--------x. 3 root root 15 11月 15 11:05 /a
[root@egon ~~]# ll -d /a/b
d--------x. 2 root root 18 11月 15 11:06 /a/b
[root@egon ~~]# ll /a/b/hello.sh
-rw-r--r-x. 1 root root 10 11月 15 11:06 /a/b/hello.sh
[root@egon ~~]# su - egon
[egon@egon ~~]$ /a/b/hello.sh  # 绝对路径的方式
hello world!
[egon@egon ~~]$ cd /a
[egon@egon /a/a]$ ./b/hello.sh  # 相对路径的方式,加./作为前缀
hello world!

----------------------------------------------------------------------------------------------
[root@web01 ~]# cat a.sh 
#!/bin/bash
echo "hello"
exit
#重新启动一个子shell运行脚本
[root@web01 ~]# bash a.sh 
hello
[root@web01 ~]# ./a.sh 
hello

#在当前shell中运行脚本
[root@web01 ~]# . a.sh 
hello

Connection closed by foreign host.

Disconnected from remote host(yum01仓库主机) at 14:56:41.

Type `help' to learn how to use Xshell prompt.
[c:\~]$ 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琴声浮或沉__听懂只一人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值