网络运维Day10

文章目录

  • SHELL基础
    • 查看有哪些解释器
    • 使用usermod修改用户解释器
    • BASH基本特性
  • shell脚本的设计与运行
    • 编写问世脚本
    • 脚本格式规范
    • 执行shell脚本
      • 方法一
      • 方法二
      • 实验
  • 变量
    • 自定义变量
    • 环境变量
    • 位置变量
      • 案例
    • 预定义变量
  • 变量的扩展运用
    • 多种引号的区别
      • 双引号的应用
      • 单引号的应用
      • 反撇号或$()的应用
    • read命令定义变量
      • 案例
  • 条件测试
    • 字符串测试
    • 整数值比较
    • 运算
      • 常量与常量的比较
      • 常量与变量的比较
    • 文件状态的测试
  • 总结

SHELL基础

  • shell是用户与linux内核之间的解释器
  • shell环境准备,本实验需要用到一台虚拟机A即可

在这里插入图片描述

查看有哪些解释器

 [root@som ~]# cat /etc/shells                  #查看shell解释器

使用usermod修改用户解释器

[root@som ~]# usermod -s /bin/tcsh test		#使用usermod指令修改用户解释器
[root@som ~]# grep test /etc/passwd			#从/etc/passwd过滤test用户信息

BASH基本特性

查看

[root@som ~]# ls							#数据有颜色区分

重定向

在这里插入图片描述

覆盖重定向

[root@som ~]# ls  >  a.txt
[root@som ~]# cat  a.txt

追加重定向

[root@som ~]# ls  >>  a.txt
[root@som ~]# cat a.txt 

显示一个错误的文件

[root@som ~]# ls xxyyzz.txt
ls: 无法访问xxyyzz.txt: 没有那个文件或目录
[root@som ~]# ls xxyyzz.txt > b.txt                     #失败,> 收集正确信息
ls: 无法访问xxyyzz.txt: 没有那个文件或目录
[root@som ~]# ls xxyyzz.txt  2>  b.txt                  #正确,2> 收集错误信息
[root@som ~]# cat b.txt 
ls: 无法访问xxyyzz.txt: 没有那个文件或目录

收集正确和错误的信息

[root@som ~]# ls  a.txt  xxyzz.txt  >  b.txt
[root@som ~]# ls  a.txt  xxyzz.txt  &>  b.txt           #收集所有信息
[root@som ~]# cat b.txt 
ls: 无法访问xxyzz.txt: 没有那个文件或目录
a.      txt

管道

[root@som ~]# ifconfig | head -2                      #查看ip信息前两行

在这里插入图片描述

快捷键与Tab键补齐,常见快捷键如表所示

在这里插入图片描述

shell脚本的设计与运行

什么是shell脚本

  • Shell脚本是一种自动化执行任务的脚本语言,可以帮助我们完成日常任务,比如文件管理、进程管理等。
  • 脚本可以理解为功能性文件

编写问世脚本

[root@som ~]# mkdir -p /root/shell/day0{1..2}
[root@som ~]# vim /root/shell/day01/first.sh
echo "Hello World"
[root@som ~]# chmod  +x /root/shell/day01/first.sh          #添加执行权限
[root@som ~]# /root/shell/day01/first.sh                    #绝对路径形式执行
Hello World
[root@som ~]# cd /root/shell/day01/		  	  #切换目录
[root@som day01]# ./first.sh                  #相对路径执行
Hello World

脚本格式规范

  • 脚本声明(需要的解释器、作者信息等)
  • 注释信息(步骤、思路、用途、变量含义等)
  • 可执行语句(操作代码)

优化刚刚的first.sh脚本

[root@som day01]# vim /root/shell/day01/first.sh
#!/bin/bash                            #指定解释器
#This a test program for shell.        #这是一个测试性的程序
echo "Hello World"
[root@som day01]# ./first.sh		   #执行脚本

执行shell脚本

执行脚本的多种方式

在这里插入图片描述

方法一

脚本在执行的时候要有执行(x)权限,否则会报错

[root@som day01]# chmod -x first.sh 
[root@som day01]# ./first.sh                     #报错
-bash: ./first.sh: 权限不够
[root@som day01]# /root/shell/day01/first.sh     #报错
-bash: /root/shell/day01/first.sh: 权限不够

方法二

不需要文件有可执行权限,指定解释器执行脚本

[root@som day01]# sh first.sh       		#指定sh来执行first.sh
[root@som day01]# bash first.sh  			#指定bash解释器执行first.sh

实验

[root@som day01]# vim tmp.sh				#编写tmp.sh
#!/bin/bash
exit
[root@som day01]# sh tmp.sh        			#指定运行脚本,没有关闭终端
[root@som day01]# vim tmp.sh				#编写tmp.sh
#!/bin/bash
exit
[root@som day01]# source  tmp.sh			#执行tmp.sh,会关闭终端

总结:

  • 指定解释器会新开子进程
  • 使用source不会新开子进程

变量

自定义变量

  • 环境变量(变量名通常大写,有操作系统维护)
  • 位置变量(bash内置变量,存储脚本执行时的参数)
  • 预定义变量(bash内置变量,可以调用但是不能赋值或修改)
  • 自定义变量(用户自主设置)

定义变量

  • 可以是数字,字母,下划线
  • 变量名不能使用特殊符号,会报错
  • 不能以数字开头

查看变量

  • echo ${变量名}
  • echo $变量名

定义变量

[root@som ~]# a=11
[root@som ~]# echo $a           	#调用变量,查看变量的值
[root@som ~]# a=33              	#变量名已经存在,再次赋值,里面的内容会被覆盖
[root@som ~]# echo $a			 	#调用变量,查看变量的值
[root@som ~]# a)=11					#变量包含特殊符号,所以定义失败
-bash: 未预期的符号 `)' 附近有语法错误	
[root@som ~]# 3a=33					#变量数字开头,所以定义失败
bash: 3a=33: 未找到命令...
[root@som ~]# a_0=11				#没有违规,所以成功
[root@som ~]# _a=11					#没有违规,所以成功
[root@som ~]# _0=11					#没有违规,所以成功
[root@som ~]# x=CentOS
[root@som ~]# echo $x           	#成功
[root@som ~]# echo ${x}        		#成功

若想要显示CentOS7.9

[root@som ~]# echo $x7.9          	#失败,会显示.9,此时是把$x7看成一个变量名

加上{}可以成功

[root@som ~]# echo ${x}7.9			#输出CentOS7.9
[root@som ~]# echo ${x}7.6			#输出CentOS7.6

取消变量

[root@som ~]# unset x					#取消变量
[root@som ~]# echo $x

环境变量

  • 存储在/etc/profile或~/.bash_profile
  • 命令env可以列出所有环境变量
  • 环境变量通常是大写字母
[root@som ~]# echo $PATH             	#命令搜索的路径变量
[root@som ~]# echo $PWD             	#返回当前工作目录
/root
[root@som ~]# echo $USER            	#显示当前登录的用户
root
[root@som ~]# echo $UID               	#显示当前用户的uid
0
[root@som ~]# echo $HOME          		#显示当前用户的家目录
/root
[root@som ~]# echo $SHELL           	#显示当前的SHELL
/bin/bash 

位置变量

  • 存储脚本时执行的参数
  • $1 $2 $3 …$9 ${10} ${11} … #从10开始位置变量需要加{}
[root@som ~]# vim /root/shell/day01/vars.sh
#!/bin/bash
echo $1
echo $2
echo $3
[root@som ~]# chmod +x /root/shell/day01/vars.sh 
[root@som ~]# /root/shell/day01/vars.sh aa bb cc       #执行脚本,传递参数
aa
bb
cc

案例

  • 编写一个user.sh脚本,使用它创建用户
[root@som ~]# vim /root/shell/day01/user.sh
#!/bin/bash
useradd "$1"						#创建用户
echo "$2" | passwd --stdin $1		#设置密码
[root@som ~]# chmod +x /root/shell/day01/user.sh
[root@som ~]# /root/shell/day01/user.sh tom 123			#执行脚本
[root@som ~]# /root/shell/day01/user.sh jim 123			#执行脚本

预定义变量

  • 用来保存脚本程序的执行信息,可以直接使用这些变量,但是不能为这些变量赋值

在这里插入图片描述

$?:执行上一条命令的返回状态,0为正确,非0为错误

[root@som ~]# ls /etc/hosts				#执行命令成功
/etc/hosts
[root@som ~]# echo $?           		#返回值为0,正确
0
[root@som ~]# ls /xxxxxyyyy     		#执行命令错误    	
ls: 无法访问/xxxxxyyyy: 没有那个文件或目录
[root@som ~]# echo $?					#返回值为非0,失败
2

其他几个预定义变量的测试

[root@som ~]# vim /root/shell/day01/pre.sh
#!/bin/bash
echo $0             #执行脚本的名字
echo $$             #当前脚本的进程号
echo $#             #位置变量的个数
echo $*             #所有位置变量
[root@som7 ~]# chmod  +x /root/shell/day01/pre.sh
[root@som7 ~]# /root/shell/day01/pre.sh  a b c d
/root/shell/day01/pre.sh
46608
4
a b c d

变量的扩展运用

多种引号的区别

双引号的应用

  • 使用双引号可以界定一个完整字符串
[root@som ~]# touch a b c            	#创建了三个文件
[root@som ~]# touch "a b c"           	#创建1一个文件
[root@som ~]# ls -l
[root@som ~]# rm -rf  a b c           	#删除三个文件
[root@som ~]# rm -rf  "a b c"       	#删除一个文件

单引号的应用

  • 界定一个完整的字符串,并且可以实现屏蔽特殊符号的功能。
  • 当双引号里面有变量时,会被扩展出来,也就是会取变量的值
[root@som ~]# hi="world"
[root@som ~]# echo "$hi"               #成功
world
[root@som ~]# echo '$hi'               #失败,当成一个字符串
$hi

当没有特殊符号时,单引号和双引号的含义是一样的

[root@som ~]# touch "a b c"			
[root@som ~]# touch 'c d e'

练习单引号和双引号的区别

[root@som ~]# echo "$USER id is $UID"	#调用变量
root id is 0
[root@som ~]# echo '$USER id is $UID'	#不调用变量
$USER id is $UID

反撇号或$()的应用

  • 使用反撇号``或$()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换。
[root@som ~]# grep root /etc/passwd
[root@som ~]# test=`grep root /etc/passwd`		#定义变量,内容为命令输出结果
[root@som ~]# echo $test
[root@som ~]# test2=$(grep root /etc/passwd)	#定义变量,内容为命令输出结果
[root@som ~]# echo $test2

read命令定义变量

  • 使用read命令从键盘读取变量值
    • -p: 指定提示信息
    • -s: 屏蔽输入(键盘输入内容,在屏幕上不显示)
    • -t: 可指定超时秒数(指定秒数不输入,直接退出)

read基本用法

  • 执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量:
[root@som ~]# read iname					#定义变量iname
123											#从键盘输入123作为iname的值
[root@som ~]# echo $iname					#输出变量iname
123

虽然可以赋值。但是屏幕上没有任何提示信息,在未来写脚本的时候不太方便,可以加上-p选项,给出提示

[root@som ~]# read -p "请输入用户名:" iname	#定义变量
请输入用户名:tom
[root@som ~]# echo $iname					 #输出变量
tom

案例

创建一个脚本,通过read定义变量创建用户,更改密码

[root@som ~]# vim /root/shell/day01/read.sh
#!/bin/bash
read -p "请输入用户名:" name
read -p "请输入密码:"   pass
useradd $name
echo "$pass" | passwd --stdin $name
[root@som ~]# chmod +x /root/shell/day01/read.sh
[root@som ~]# /root/shell/day01/read.sh 
请输入用户名:user2
请输入密码:a
更改用户 user2 的密码 。
passwd:所有的身份验证令牌已经成功更新。

但是此时密码是名为显示的,不安全,可以使用-s参数,不显示终端输入的信息

[root@som ~]# vim /root/shell/day01/read.sh
read -p "请输入用户名:" name
read -s -p "请输入密码:"   pass
useradd $name
echo "$pass" | passwd --stdin $name
[root@som ~]# /root/shell/day01/read.sh 
请输入用户名:user3
请输入密码:
更改用户 user3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@som ~]# read -t 3 iname               #3秒不输入直接退出

条件测试

  • 语法格式:使用 [ 表达式 ],表达式两边至少要留一个空格。

字符串测试

  • 是否为空 [ -z 字符串 ]
[root@som ~]# echo $TT
[root@som ~]# [ -z $TT ]         		#T为空吗
[root@som ~]# echo $?           		#是,返回值为0
0
[root@som ~]# TT="hello"
[root@som ~]# [ -z $TT ]         		#T为空吗
[root@som ~]# echo $?           		#否,返回值非0
1

等于:[ 字符串1 == 字符串2 ]

[root@som ~]# [ a == a ]				#判断a==a
[root@som ~]# echo $?           		#查看返回值
0
[root@som ~]# [ a == c ]				#判断a==c
[root@som ~]# echo $?					#查看返回值
1

变量和常量的判断

[root@som ~]# [ $USER == root ]			#环境变量USER的值是root吗
[root@som ~]# echo $?
0
[root@som ~]# [ $USER == tom ]			#环境变量USER的值是tom吗
[root@som ~]# echo $?
1

不等于:[ 字符串1 != 字符串2 ]

[root@som ~]# [   $USER != tom   ]			#环境变量USER的值不是tom
[root@som ~]# echo $?
0

整数值比较

格式:[ 整数值1 操作符 整数值2 ]

  • -eq:等于
  • -ne:不等于
  • -gt:大于
  • -ge:大于等于
  • -lt:小于
  • -le:小于等于

参与比较的必须是整数(可以调用变量),比较非整数值时会出错

运算

四则运算:+ - * /

求模取余:%

计算练习

[root@som ~]# echo $[1+1]					#计算1+1
[root@som ~]# echo $[10-2]					#计算10-2
[root@som ~]# echo $[2*2]					#计算2*2
[root@som ~]# echo $[6/3]					#计算6/3
[root@som ~]# echo $[10%3]					#取10/3的余数

变量计算

[root@som ~]# a=10
[root@som ~]# b=20
[root@som ~]# echo $[a+b]					#计算变量a+变量b

常量与常量的比较

小于

[root@som ~]# [ 3 -lt 8 ]
[root@som ~]# echo $?
0

大于

[root@som ~]# [ 3 -gt 2 ]
[root@som ~]# echo $?
0

等于

[root@som ~]# [ 3 -eq 3 ]
[root@som ~]# echo $?
0

小于等于

[root@som ~]# [ 3 -le 3 ]
[root@som ~]# echo $?
0

大于等于

[root@som ~]# [ 3 -ge 1 ]
[root@som ~]# echo $?
0

常量与变量的比较

判断计算机登录的用户

[root@som ~]# who | wc -l
[root@som ~]# [ $(who | wc -l)  -ge  2 ]
[root@som ~]# echo $?
0

文件状态的测试

  • 格式:[ 操作符 文件或目录 ]
  • -e:判断对象是否存在(不管是目录还是文件),存在则结果为真
[root@som ~]# [ -e /etc ]
[root@som ~]# echo $?
0
[root@som ~]# [ -e /etc/hosts ]
[root@som ~]# echo $?
0
[root@som ~]# [ -e /etc/xxyy ]
[root@som ~]# echo $?
1
  • -d:判断对象是否为目录(存在且是目录),是则为真
[root@som ~]# [ -d /etc/hosts ]
[root@som ~]# echo $?
1
[root@som ~]# [ -d /etc/ ]
[root@som ~]# echo $?
0
  • -f:判断对象是否为文件(存在且是文件)是则为真
[root@som ~]# [ -f /etc/ ]
[root@som ~]# echo $?
1
[root@som ~]# [ -f /etc/hosts ]
[root@som ~]# echo $?
0
  • -r:判断对象是否可读,是则为真
[root@som ~]# ls -l  /etc/hosts
-rw-r--r--. 1 root root 158 67 2013 /etc/hosts
[root@som ~]# [ -r /etc/hosts ]
[root@som ~]# echo $?
0
  • -w:判断对象是否可写,是则为真
[root@som ~]# [ -w /etc/hosts ]
[root@som ~]# echo $?
0
  • -x:判断对象是否具有可执行权限,是则为真
[root@som ~]# [ -x /etc/hosts ]
[root@som ~]# echo $?
1

总结

  • 掌握SHELL脚本执行流程
  • 掌握SHELL中的变量
    • 自定义变量
    • 环境变量
    • 位置变量
    • 预定义变量
  • 掌握SHELL中条件测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/134672.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【星海随笔】SDN neutron (三) Service-plugin

Neutron L3 L3的实现只负责路由的功能,传统路由器中的其他功能(如Firewalls、LB、VPN)都被独立出来实现了,因此ML3的实际需求比较少。 neutron-server 接到请求 –> 将请求发送到MQ –> neotron-plugins 得到请求 –> 发…

编程艺术之源:深入了解设计模式和设计原则

深入了解设计模式和设计原则 一、认识设计模式1.1、设计模式是什么?1.2、设计模式是怎么来的?1.3、设计模式解决了什么问题? 二、设计模式的基础2.1、面向对象思想2.2、设计原则 三、如何学习设计模式3.1、明确目的3.2、学习步骤 总结 一、认…

HTML跳转锚点

跳转锚点适用于本页面和其他页面的任意标签的跳转以及JavaScript的运行 使用方法即给标签加上独一无二的id属性&#xff0c;再使用a标签跳转 如果是其他页面的标签只需加上其他页面的路径&#xff0c;eg.href"其他页面的路径#zp1" id属性的最好不要使用数字开头 <…

Vert.x学习笔记-什么是Verticle

什么是Verticle Verticle是Vert.x应用中的基本编程单元&#xff0c;类似于Java中的Servlet、Pojo Bean或Akka中的Actor。它可以使用不同的编程语言实现&#xff0c;并且这些由不同编程语言实现的Verticle可以封装到一个模块中&#xff0c;进而部署到一个Vert.x应用中。Verticl…

关系型数据库Redis安装与写入数据

文章目录 安装和初步选择数据库创建键值对数据类型 安装和初步 安装 Redis是开源的跨平台非关系型数据库&#xff0c;特点是占用资源低、查询速度快。 首先&#xff0c;在Github上下载最新发布的Redis-xxxx.zip压缩文件&#xff0c;下载之后解压&#xff0c;并将解压后的路径…

要找事做,我真怕被闲死

要找事做&#xff0c;我真怕被闲死 | 昨晚睡足了5个多小时&#xff0c;元气开始恢复&#xff0c;今晨6点钟醒来&#xff0c;如厕后无睡意&#xff0c;便窝在被子里闭目养神&#xff0c;同时想心事。 7点钟翻身起床穿衣洗刷后&#xff0c;烧瓶开水泡杯浓茶&#xff0c;打开电脑…

如何关闭Windows Defender(亲测可行!!非常简单)

一、背景 Windows Defender&#xff08;简称WD&#xff09;真的太讨厌了&#xff0c;经常给你报你下载的文件是病毒&#xff0c;且不说真的是不是病毒&#xff0c;它都不询问直接删。 另外聚资料显示WD还会不合时宜地执行扫描导致系统变慢&#xff08;不会在合适的、空闲的时…

Linux shell编程学习笔记24:函数定义和使用

为了实现模块化设计和代码重用&#xff0c;很多编程语言支持函数或过程&#xff0c;Linux shell也支持函数定义和调用。 Linux shell中的函数与其它编程语言很多有相似之处&#xff0c;也有自己独特之处。 1 函数的定义 1.1 标准格式 function 函数名(){语句或命令1……语句…

一步一步详细介绍如何使用 OpenCV 制作低成本立体相机

在这篇文章中,我们将学习如何创建定制的低成本立体相机(使用一对网络摄像头)并使用 OpenCV 捕获 3D 视频。我们提供 Python 和 C++ 代码。文末并附完整的免费代码下载链接 我们都喜欢观看上面所示的 3D 电影和视频。您需要如图 1 所示的红青色 3D 眼镜才能体验 3D 效果。它是…

操作系统 | proc文件系统

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 操作系统实验之proc文件系统 1.1 实验目的 1.2 实验内容 1.3 实验步骤 1.4 实验…

Azure 机器学习 - 机器学习中的企业安全和治理

目录 限制对资源和操作的访问网络安全性和隔离数据加密数据渗透防护漏洞扫描审核和管理合规性 在本文中&#xff0c;你将了解可用于 Azure 机器学习的安全和治理功能。 如果管理员、DevOps 和 MLOps 想要创建符合公司策略的安全配置&#xff0c;那么这些功能对其十分有用。 通过…

HTML使用lable将文字与控件进行关联以获取焦点

先养养眼再往下看 注释很详细&#xff0c;直接上代码 <form action""><!-- 第一种方法:用id的方式绑定账户(文字)和输入框 --><label for"zhanghu">账户</label><input "text" id"zhanghu" name"ac…

Milvus Cloud ——Agent 的展望

Agent 的展望 目前,LLM Agent 大多是处于实验和概念验证的阶段,持续提升 Agent 的能力才能让它真正从科幻走向现实。当然,我们也可以看到,围绕 LLM Agent 的生态也已经开始逐渐丰富,大部分工作都可以归类到以下三个方面进行探索: Agent模型 AgentBench[4] 指出了不同的 L…

Azure 机器学习 - 使用受保护工作区时的网络流量流

目录 环境准备入站和出站要求方案&#xff1a;从工作室访问工作区方案&#xff1a;从工作室使用 AutoML、设计器、数据集和数据存储方案&#xff1a;使用计算实例和计算群集方案&#xff1a;使用联机终结点入站通信出站通信 方案&#xff1a;使用 Azure Kubernetes 服务方案&am…

ROS 学习应用篇(三)服务Server学习之Server

话题Topic是订阅器与发布器节点之间的&#xff0c;而服务则是客户端&#xff08;Client&#xff09;和服务器&#xff08;Server&#xff09;间的&#xff0c;前者是异步的&#xff0c;后者是同步的。而且话题是单项的不需要服务器上线&#xff0c;而服务是双向的。在开启服务之…

使用米联客FPGA开发板进行光口开发时遇到的问题总结

使用的开发板型号&#xff1a;米联客MA703FA&#xff0c; 实物图如下 FPGA型号为a35t 米联客提供的开发板资料中的FPGA型号为a100&#xff0c;所以要想使用开发板例程必须进行FPGA的重新选择。如下图 通过对开发板原理图的分析&#xff0c;例程代码不用做任何修改就可使用&am…

Linux常用命令——bzless命令

在线Linux命令查询工具 bzless 增强.bz2压缩包查看器 补充说明 bzless命令是增强“.bz2”压缩包查看器&#xff0c;bzless比bzmore命令功能更加强大。 语法 bzless(参数)参数 文件&#xff1a;指定要分屏显示的.bz2压缩包。 在线Linux命令查询工具

Pathways

信号通路signaling pathway-武汉华美生物 (cusabio.cn) 神经信号通路(Neuronal Signaling)--selleck.cn PI3K/Akt/mTOR信号通路 表观遗传 甲基化 免疫&炎症 酪氨酸蛋白激酶 血管生成 凋亡 自噬 内质网应激&UPR响应 JAK/STAT信号通路 MAPK信号通路 细胞骨架…

网络运维Day11

文章目录 if语句if单分支应用案例 if双分支应用案例 if多分支应用案例 for循环while循环案例 正则表达式基本正则Perl兼容的正则 综合练习总结 if语句 if单分支 if单分支的语法组成&#xff1a; if 条件测试;then 命令序列 fiif 条件测试then 命令序列 fi应用案例 判断用…

Linux学习教程(第二章 Linux系统安装)2

第二章 Linux系统安装 四、使用U盘安装Linux系统 前面章节介绍了如何通过虚拟机 VMware 安装 Linux 系统&#xff0c;而实际开发中&#xff0c;我们更多的是要将 Linux 系统直接安装到电脑上。 直接在电脑上安装 Linux 系统的常用方法有 2 种&#xff0c;分别是用光盘安装和用…