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. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现

shell的执行方式

1 执行1:bash    file1
2 执行2:sh file1
3 执行3:. file1
4 执行4: source file1

多种执行方式的区别:

1.准备环境

1 vim bash.sh
2 #!/usr/bin/bash
3 cd /home/
4 ls

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

3.观察目录改变了。说明影响的是当前。并使用子shell执行方式执行。

该种执行方式,是不同于前者SUB shell执行。
而是在当前shell执行,用于影响当前shell环境。

shell解释器在哪

1 cat /etc/shells
2 或
3 chsh -l

变量

shell 变量? 用一个固定的字符串去表示不固定的内容,便于修改。

自定义变量

用户自定义变量是最常用的变量类型,其特点是变量名和变量值都是由用户自由定义的。

学习要点

定义变量: 变量名=变量值

引用变量: $变量名或 ${变量名}

查看变量: echo $变量名; "set"可以查看所有变量(包括自定义变量和环境变量)

取消变量: unset 变量名

定义变量

该如何定义变量呢?很简单,只需执行"变量名=变量值"命令即可,不过要遵守变量定义规则。例如

1 [root@localhost ~]# name="test 666"

变量调用

当我们需要提取变量中的内容时,需要在变量名之前加入"$"符号。
那么最简单的变量调用就是通过 echo 命令输出变量的值。命令如下

1 #定义变量name
2
3 [root@localhost ~]# name="test 666"
4
5 #输出变量name的值
6
7 [root@localhost ~]# echo $name
8
9 test 666

错误定义示范

变量的定义就是这么简单,但是如果不遵守变量定义规则,就会报错。比如:

#变量名不能以数字开头

[root@localhost ~]# 2name="test 666"

-bash: 2name=test 666: command not found

#等号左右两侧不能有空格

#变量的值如果有空格,必须用引号包含

[root@localhost ~]# name=test 666

-bash: 666: command not found

重复定义变量

重复定义变量会进行变量叠加。例如:

#定义变量aa的值是123

#重复定义变量aa的值是源aa的值加上456

 1 [root@localhost ~]# aa="$aa"456
2
3 #调用变量aa,发现值已经变成了123456
4
5 #在进行变量叠加时,也可以使用${变量名}格式
6
7 [root@localhost ~]# aa=${aa}789
8
9 [root@localhost ~]# echo $aa
10
11 123456789

这里要小心,在进行变量叠加时,变量名需要用双引号或 ${} 包含。

变量查看

我们可以通过 echo 命令查询已经设定的变量的值,这种查询是已知变量名查询变量值。
但是如果我不知道变量名,那么可以查询系统中已经存在的变量吗?

[root@localhost ~]# set

变量删除

 1 [root@localhost ~]# aa="$aa"456
2
3 #调用变量aa,发现值已经变成了123456
4
5 #在进行变量叠加时,也可以使用${变量名}格式
6
7 [root@localhost ~]# aa=${aa}789
8
9 [root@localhost ~]# echo $aa
10
11 123456789

示例

使用变量前

需求:编写测试主机在线的脚本。当主机在线提示在线,当主机不在线提示不在线。

编写脚本

ping    -c1      192.168.100.10     &>    /dev/null    &&   echo      192.168.100.10up     ||    echo      192.168.100.10down

注释:&&和||是三目表达式、&& 前面的命令成功。执行后面的命令、||前面的命令失败。执行后面的命令

思考:如果更换测试IP。需要修改脚本的哪些部分?

需要修改三个部分

使用变量后

编写脚本

1 #!/bin/bash
2
3 ip=192.168.100.10
4
5 ping -c1 $ip &>/dev/null && echo $ip up || echo "$ip down"

思考:添加变量后,修改一处即可。

交互定义变量

read 从键盘读入变量值

赋值方式:read 变量名

示例

1 read -p "请输入您测试的IP地址:" ip
2
3 ping -c1 $ip &>/dev/null && echo " $ip up" || echo "$ip
4 down"

注意事项:3种引号

定义或引用变量时注意事项:

" " 弱引用
' ' 强引用
` ` 优先执行

 1 双引号1
2 [root@localhost ~]# schoo=1000 phone
3 错误示范,shell把空格识别做命令分隔符。
4 bash: phone: 未找到命令
5 [root@localhost ~]# schoo="1000 phone"
6 正确示范,变量值中的空格,被转义为一个普通符号
7 [root@localhost ~]# echo $schoo
8 1000 phone
9 执行成功。
10
11 双引号2
12 [root@localhost ~]# schoo=$schoo is good
13 错误示范,已有变量的基础上,再追加内容。
14 bash: is: 未找到命令
15 没有加引号,被识别为两条命令
16 [root@localhost ~]# schoo="$schoo is good"
17 正确示范,加了双引号。组成了整体,空格失去含义。
18 [root@localhost ~]# echo $schoo
19 1000 phone is good
20 成功
1 单引号
2 [root@localhost ~]# schoo='$schoo 666'
3 单引号,转义一切符号
4 [root@localhost ~]# echo $schoo
5 $schoo 666
6 $也被转义了。一切都被转义了。
1 反引号
2 [root@localhost ~]# schoo=`date`
3 反引号是优先执行。先执行date的命令,再执行定义变量。
4 [root@localhost ~]# echo $schoo
5 2022年 08月 23日 星期二 14:57:13 CST
6 所以看到变量的结果,是时间

注意

1.变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
2.命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
3.中间不能有空格,可以使用下划线(_)。
4.不能使用标点符号。
5.不能使用bash里的关键字(可用help命令查看保留关键字)。
6.起变量名,请使用五个字母以上。

整数运算

 1 方法一:expr
2 语法
3 expr 1 + 2
4 expr $num1 + $num2
5 +加
6 -减
7 \*乘(*是任意字符,使用\ 转义一下。)
8 /除
9 %取余
10 需求:
11 运算学员的成绩总分
12 制作脚本
13 [root@localhost ~]# vim sum.sh
14 #!/bin/bash
15 read -p "请输入您的第一门成绩: " number1
16 read -p "请输入您的第二门成绩: " number2
17 echo -n "总成绩是: "
18 expr $number1 + $number2
19 授权脚本
20 [root@localhost ~]# chmod +x sum.sh
21 测试脚本
22 [root@master1 ~]# ./sum.sh
23 请输入您的第一门成绩: 60
24 请输入您的第二门成绩: 70
25 总成绩是: 130

小数运算(了解)

1 请提前安装计算器程序bc
2 echo "2*4" |bc
3 echo "2^4" |bc
4 echo "scale=2;6/4" |bc
5 bc:交互运算器
6 scale=2 保留小数点后面两位

环境变量(了解)

前言

自定义变量,只能再当前shell生效。其他shell是不生效的,说白了,你的变量只能你用。那如果有些变量,需要所有的用户都使用,怎么办呢?

1 定义环境变量:
2 直接声明
3 方法一 export back_dir2=/home/backup
4 声明环境变量
5 转换声明
6 方法二 export back_dir1 将自定义变量转换成环境变量
7 转换环境变量

变量作用范围: 在当前shell和子shell有效
想使变量。在当前用户登陆后一直生效,可以将变量放到~/.bash_profile
想使变量。在所有用户登陆后一直生效,可以将变量放到/etc/profile

 1 示例
2 [root@localhost ~]# abc=123
3 定义普通变量1
4 [root@localhost ~]# def=456
5 定义普通变量2
6 [root@localhost ~]# bash
7 打开子shell
8 [root@localhost ~]# echo $abc
9 调用普通变量,失败
10 [root@localhost ~]# echo $def
11 调用普通变量,失败
12 [root@localhost ~]# exit
13 退出子shell
14 exit
15 [root@localhost ~]# export abc
16 讲变量声明为环境变量。儿子shell都能用。
17 [root@localhost ~]# bash
18 打开子shell
19 [root@localhost ~]# echo $abc
20 发现变量可以用了。
21 123
22 [root@localhost ~]# echo $def
23 普通变量还是不行。

位置变量和预定义变量(了解)

位置变量语法

1 位置变量
2 命令 参数1 参数2 参数3 ....9以后特殊定义
3 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ...
 1 示例
2 需求
3 制定脚本程序,用户自行输入两门学科的成绩(整数),自动算出平均分。
4 制作脚本
5 [root@localhost ~]# vim avg.sh
6 #!/bin/bash
7 echo "($1+$2)/2" | bc
8 [root@localhost ~]# chmod +x avg.sh
9 测试脚本
10 [root@localhost ~]# ./avg.sh 88 77
11 82
12 请思考
13 位置变量和read读取变量,到底用哪个?
14 使用谁都可以。
15 #!/bin/bash
16 read -p "请输入您的第1门成绩: " num1
17 read -p "请输入您的第2门成绩: " num2
18 echo -n "您的平均成绩是:"
19 echo "($num1+$num2)/2" |bc
总结
1.位置变量就是$1,$2,$3,$4
2.位置变量预先已经被定义过了。
3.用户使用时,必须携带参数。
4.位置变量不是程序设计的唯一方法。比如read也可以。

总结
这两类变量,在设计系统时就已经定义好了。
需要使用时,直接调用即可。

练习

编写自动创建用户并设置初始化脚本

1 vim create.sh
2 #!/bin/bash
3 read -p "请输入要创建用户的名称:" name
4 useradd ${name}
5 echo "123456" | passwd --stdin ${name} &> /dev/null
6 echo ${name} 已经创建完成,密码是123456
7 [root@bogon ~]# sh create.sh
8 请输入要创建用户的名称:kk
9 kk 已经创建完成,密码是123456

Shell第一章《变量》的更多相关文章

  1. (linux shell)第一章--小试牛刀(上)

    来源:(linux shell)第一章--小试牛刀(上) 从今天開始,我们一起来学习<linux shell脚本攻略>这本书. 1.1简单介绍 shell脚本一般是一个以#!起始的文本文件 ...

  2. (linux shell)第一章--小试牛刀(下)

    文章来源: (linux shell)第一章--小试牛刀(下) 1.6 数组和关联数组 1.6.1 预备知识 Bash同一时候支持普通数组和关联数组.普通数组仅仅能使用整数作为数组索引,而关联数组能够 ...

  3. Python基础教程-第一章-变量、函数、字符串

    1.1变量 变量基本上就是代表(或者引用)某个值的名字,举例来说,如果希望用x代表3,只需要执行下面的语句即可: >>>x = 3 这样的操作称为赋值(assignment),值3赋 ...

  4. python自学之第一章 —— 变量

    1.变量的命名(): (1).可以包含数字.字母.下划线‘_’,但只能以字母和下划线‘_’开头,不能以数字开头! (2).变量的命名不能包含空格. (3).不能将python中的关键字(reserve ...

  5. Linux系统shell编程自学_第一章基础

    第一章 基础shell的优势在于处理操作系统底层的业务,Python,php的优势在于开发运维工具,web界面的管理工具以及web业务开发.处理一键安装.优化.报警脚本shell又叫命令解释器,它能识 ...

  6. 【C语言探索之旅】 第一部分第四课第一章:变量的世界之内存那档事

    内容简介 1.课程大纲 2.第一部分第四课第一章:变量的世界之内存那档事 3.第一部分第四课第二章预告:变量的世界之声明变量 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答 ...

  7. PHP:第一章——php中的变量001 /普通赋值/引用赋值/php变量的检查与销毁

    <?php //php中的变量: //php中的变量用一个美元符$后面紧跟着变量名来表示,变量名是区分大小写的. //有效的变量只能是字母或者下划线开头,后面跟任意数量的字母.数字.或者下划线. ...

  8. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  9. 简学Python第一章__进入PY的世界

    #cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...

随机推荐

  1. C# List转String的办法

    2022年5月28日 初始记录 代码: String.Join(",", List.ToArray());

  2. php判断客户端浏览器类型

    /** * 判断浏览器名称和版本 */ function get_user_browser() { if (empty($_SERVER['HTTP_USER_AGENT'])) { return ' ...

  3. 用QT制作3D点云显示器——QtDataVisualization

    因为QT的三维显示模块QtDataVisualization已经对个人开发免费开放了,所以在制作点云,地图,表格之类的东西的时候,其实我们都不需要使用QtCharts或者QOpenGL模块了.直接使用 ...

  4. Sublime Text 新建代码片段(图解)

    新建代码片段 1.打开NEW Snippet- 2.编辑代码片段 3.设置快捷键,按tab键执行 更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_4451949 ...

  5. 引入gitlab仓库代码到npm包的教程

    背景介绍 随着人类地发展,社会地进步,计算机技术地更新迭代,每一片码海里都有它宝贵的财富,每一座码山里都有着各自的秘密.怎么守住财富,隐藏一些秘密,成了一些开发人员所关心的事情. 需求分析 简单地说, ...

  6. Tensorflow2 深度学习十必知

    博主根据自身多年的深度学习算法研发经验,整理分享以下十条必知. 含参考资料链接,部分附上相关代码实现. 独乐乐不如众乐乐,希望对各位看客有所帮助. 待回头有时间再展开细节说一说深度学习里的那些道道. ...

  7. SQL SERVER 算法面试题,自己再插入数据时,本想一次性复制10条数据,结果变成了1024条。产生一个算法bug,最后记录一下

  8. NC24017 [USACO 2016 Jan S]Angry Cows

    NC24017 [USACO 2016 Jan S]Angry Cows 题目 题目描述 Bessie the cow has designed what she thinks will be the ...

  9. P2575 高手过招 题解

    题目描述 我们考虑如何把问题转换成博弈论来求解. 我们对于每一行之前都加上一个空格. 设原来这一行的空格个数是 \(C\) ,那么此时空格个数变成 \(C + 1\) . 然后按照从左到右的顺序给每一 ...

  10. Tapdata Cloud 2.1.5来啦:新增支持Amazon RDS数据库,错误日志查询更便捷,Agent部署细节再优化

      需求持续更新,优化一刻不停--Tapdata Cloud 2.1.5 来啦!   最新发布的版本中,数据连接再上新,同时新增任务报错相关信息快速查询入口,开始支持 JVM 参数自定义设置.   更 ...