shell基础

一.Shell脚本编程概述

1.基本概念

  • 将要执行的命令按顺序保存到一个文本文件;

  • 给该文件可执行权限;

  • 可结合各种Shell控制语句以完成更复杂的操作。

2.作用

Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令

解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内

核执行,并输出执行结果。常见的Shell解释器程序有很多种,使用不同的Shell时,其内部指令、

命令行提示等方面会存在一些区别。

3.Linux系统中常见的Shell脚本种类

通过/etc/shells文件可以了解当前Linux系统所支持的Shell脚本种类

  • bash:基于gun的框架下发展的shell(/bin/bash)。是目前大多数Linux版本采用的默认shell
  • csh:类似c语言的shell
  • tcsh:整合了csh,提供了更多功能
  • sh:已经被bash替换
  • nologin:让用户无法登录

4.应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行

二.Shell脚本的构成规范

编写脚本代码

  • 使用vi或者vim编辑器,一般都是使用vim编辑器
  • 每行一条Linux命令,按执行顺序一次编写
vim 1.sh					#使用vim编辑器编写shell脚本
#!/bin/bash					#脚本解释器声明
#输出hello 		            #注释
echo "hello "			    #linux命令
  1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器,其他类型的解释器如#!/bin/python;#!/bin/expect
  2. 注释信息:以#开头的语句表示为注释信息
  3. 可执行语句:比如echo命令用于输出"  "之间的字符串

三. Shell脚本的执行

1.脚本执行逻辑

  • 顺序执行:程序按从上到下顺序执行
  • 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  • 循环执行:程序执行过程中需要重复执行多次某段语句

2.Shell脚本的执行方法

#法一:指定路径的命令,要求文件必须有x权限
[root@localhost ~]#chmod +x /root/first.sh 
[root@localhost ~]#cd /root/
[root@localhost ~]#./first.sh 
当前目录位于:
/root#法二:指定Shell来解释脚本,不要求文件必须有x权限。
[root@localhost ~]#bash first.sh 
当前目录位于:
/root#法三:source(.) 脚本路径执行shell脚本  不建议使用,source会修改当前环境
[root@localhost ~]#source first.sh 
当前目录位于:
/root#法四:将脚本文件放入$PATH中目录的其中一个目录,直接输入脚本名
echo $PATH
/usr/local/sbin: /usr/local/bin :/usr/sbin :/usr/bin: /rpot/bin#法五:自己创建一个路径(将脚本文件所在的绝对路径添加至PATH中)
在/etc/profile文件最后添加:export PATH=$PATH:脚本所在的绝对路径
直接输入脚本名执行脚本如果想要脚本全局运行(补全),需要将脚本放入echo $PATH路径下(shell脚本的本质是命令的集合,是一个程序)(需要有运行权限)
2.1 方法一:指定路径的命令,要求文件必须有 x(可执行)权限
chmod +x /root/1.sh					#给脚本添加可执行权限
指定绝对路径: /root/1.sh 			
指定相对路径: ./1.sh

2.2 方法二:指定shell来解释脚本,不要求文件必须有 x (可执行)权限

bash(sh)执行脚本, 系统会创建一个子shell环境,并在这个子shell环境中执行这个脚本 ,脚本执行结束后系统就会自动退出bash环境

2.3 方法三: source 与 . 脚本路径执行shell脚本(不建议使用)

 不建议使用source 与 . 执行脚本会在当前 shell 环境中执行脚本 影响当前环境

2.4 方法四: 将脚本文件放入$PATH中目录的其中一个目录,直接输入脚本名执行
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin以下两个目录一般放自己创建或第三方应用程序生成的命令文件/usr/local/sbin:只有管理员能执行的命令
/usr/local/bin :所有用户能够执行的命令
以下两个目录一般放系统自带或者系统生成的命令文件/usr/sbin :只有管理员能执行的命令
/usr/bin: 所有用户能够执行的命令
/root/bin:不存在

将当前文件做个软连接放入或者使用cp复制到 /usr/local/bin目录下
直接输入脚本名执行脚本

2.5 方法五:自己创建一个路径(将脚本文件所在的绝对路径添加至PATH中)

在/etc/profile文件最后添加:export PATH=$PATH:脚本所在的绝对路径
直接输入脚本名执行脚本

3.脚本错误调试

脚本错误种类
  • 命令错误:命令出错不会影响接下来的命令继续,但是本条命令不执行
  • 语法错误:直接影响脚本无法正常运行
  • 逻辑错误:只能自己去筛查代码的正确
检查脚本错误
  • 检查语法错误:bash -n 脚本名称 (不在当前目录下加绝对路径)    
  • 检查(命令与逻辑)错误:bash -x 脚本名称 (不在当前目录下加绝对路径)  
  • set -e:一旦出错立即停止 
  • set -u:变量不存在就停止

总结:脚本错误常见的有三种区别

  • 语法错误,会导致后续的命令不继续执行,可以用bash  -n检查错误,提示的出错行数不一定是准确的
  • 命令错误,默认后续的命令还会继续执行,可以使用 bash -x进行检查
  • 逻辑错误:只能使用 bash -x检查

四.重定向与管道符

由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此要学会提取、过滤执行信息变得十分重要,所以我们需要重定向和管道。

1.交互式硬件设备标准输出输入

类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器
  • 标准输入:从该设备接收用户输入的数据

  • 标准输出:通过该设备向用户输出数据

  • 标准错误:通过该设备报告执行出错信息

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出>将输出结果保存到指定的文件(覆盖原有内容)
重定向输出>>将输出结果换行添加在文件尾部
重定向错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
重定向错误输出2>>将错误信息追加到指定的文件中
混合输出&>(无论对错都可以重定向)将标准输出、标准错误的内容保存到同一个文件中

示例1:重定向输入与输出修改密码

示例2:覆盖追加

#将12345678输入到文件log.txt中
[root@Zhuzi ~]#echo "12345678" > log.txt
[root@Zhuzi ~]#cat log.txt 
12345678
[root@Zhuzi ~]##再将112234写入log.txt中,这个时候会覆盖原来的数据
[root@Zhuzi ~]#echo "112234" > log.txt 
[root@Zhuzit ~]#cat log.txt 
112234
[root@Zhuzi ~]##继续将112234写入log.txt中,使用>>,这个时候会追加原来的数据
[root@Zhuzi ~]#echo "112234" >> log.txt 
[root@Zhuzit ~]#cat log.txt 
112234
112234

2.管道符

管道符号 “|”,将左侧的命令输出结果,作为右侧命令的处理对象

2.1 使用管道符修改密码

2.2 查看文件内容

五.echo命令:打印输出内容

选项作用
-n不追加换行
-e\b    退格
\c    抑制更多的输出
\n    换行

\t    横向制表符

\v    纵向制表符

echo -n

echo -e  \b

echo -e  \c

echo -e \n

echo -e \t

 echo -e \v

六.Shell脚本中的变量

1.变量的作用 

用来存放系统和用户需要使用的特定参数

2.变量名要求

①定义变量格式:变量名=变量值(shell中不用声明类型,所有类型均为字符串)

②定义变量时,变量名要求:

变量名区分大小写建议全部使用大写,不能使用系统内置变量。如$PATH是系统外部命令的存放

路径等。

变量名不能以数字开头,且不支持短横线 -。

3.设置变量

4.变量类型

①环境变量:系统维护的变量,用于设置工作环境,使用env命令可以查看所有环境变量

②只读变量:只可以读取不能修改的变量,相当于常量,用处较少

③自定义变量:用户自己定义的变量

④位置变量:通过命令行给脚本传递参数

主要指执行脚本时后面所跟着位置。

$1-$9:脚本后1-9的位置

${10}:脚本后10以上的位置需要借助变量分隔符{},不然会将$1认为是一个位置变量然后输出再加上后面的数字。

⑤预定义变量:系统已经定义好的变量,只需要记住即可

$*:表示所有位置参数的内容看成一个整体返回

$@:表示输出脚本后的所有位置参数,每个参数都是独立的个体

$0:表示脚本的文件名

$#:表示位置参数的总个数

$$:  当前bash的pid

$?:  代表上一次命令执行结果是否正确(0代表正确,非0代表不正确)

5、变量的作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所有子shell环境中可以继续使用

全局变量格式1: export   变量名    

全局变量格式2:export 变量名=变量值

特殊符号

 

read -p

  • 从键盘输入的内容变成变量
#!/bin/bash
read -p "请输入你要分区的设备:"  disk
read -p "请输入你要分区的大小:"  numecho -e "n\n\n\n\n${num}\nw\n " |fdisk ${disk}

整数的运算

  • 格式: expr 变量1 运算符 变量2 [运算符 变量3]

运算符:

  • 加法 :+
  • 减法 :-
  • 乘法 :\ *
  • 除法 :/
  • 取余 (取模):%
#!/bin/bash
read -p "输入第一个数" n1
read -p "输入第二个数" n2
read -p "输入第三个数" n3expr $n1 \* $n2 + $n3 - $n1

产生随机数,灵活应用取余%和随机数RANDOM

想要随机产生1-32:$[RANDOM%32+1]

$[RANDOM%6]

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化3种教学方法

在教育领域&#xff0c;教学方法对于学生的学习成果和兴趣至关重要。 第一种是项目式学习。这种方法鼓励学生通过完成实际的项目来获取知识&#xff0c;而不仅仅是在课堂上听讲。学生需要在实际操作中解决问题&#xff0c;这能培养他们的创新思维和实践能力。项目式学习还能提高…

【C++进阶】二叉搜索树(BSTree)

​&#x1f47b;内容专栏&#xff1a;C/C编程 &#x1f428;本文概括&#xff1a;二叉搜索树的基本操作(查找、删除、插入)、二叉搜索树的应用&#xff0c;KV模型。 &#x1f43c;本文作者&#xff1a;阿四啊 &#x1f438;发布时间&#xff1a;2023.11.22 一、二叉搜索树 1.1…

数据结构-快速排序“人红是非多”?看我见招拆招

目录 1.快速排序 Hoare版本&#xff1a; 挖坑法&#xff1a; 前后指针版本: 快速排序的时间复杂度 2.快速排序的优化 三数取中法选key 随机数选key 三路划分法 3. 非递归实现快速排序 1.快速排序 快速排序一共有三种版本&#xff1a;Hoare版本、挖坑法、前后指针版本…

etoken是什么意思,有什么作用?

EToken是一种数字货币&#xff0c;它是由以太坊区块链平台发行的智能合约&#xff0c;旨在为以太坊生态系统提供一种安全、可靠、去中心化的交易媒介。EToken具有多种作用&#xff0c;下面将详细介绍。 一、EToken的定义和发行 EToken是由以太坊智能合约创建的数字货币&#xf…

MONGODB 的基础 NOSQL注入基础

首先来学习一下nosql 这里安装就不进行介绍 只记录一下让自己了解mongodb ubuntu 安装后 进入 /usr/bin ./mongodb即可进入然后可通过 进入的url链接数据库 基本操作 show dbshow dbsshow tablesuse 数据库名插入数据db.admin.insert({json格式的数据})例如 db.admin.inse…

【从入门到起飞】JavaSE—多线程(2)(生命周期,线程安全问题,同步方法)

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;生命周期&#x1f384;线程的安全问题&#…

(内部资料)收下这几个人工智能学习秘籍!

秘籍一&#xff1a;练好基本功 学习基础知识&#xff1a;人工智能涉及多个学科领域&#xff0c;包括数学、计算机科学、统计学等。因此&#xff0c;学习基础知识是非常重要的。您可以通过学习线性代数、概率论和微积分等数学基础知识&#xff0c;以及掌握Python编程语言和常用…

Mybatis一级缓存和二级缓存原理剖析与源码详解

Mybatis一级缓存和二级缓存原理剖析与源码详解 在本篇文章中&#xff0c;将结合示例与源码&#xff0c;对MyBatis中的一级缓存和二级缓存进行说明。 MyBatis版本&#xff1a;3.5.2 文章目录 Mybatis一级缓存和二级缓存原理剖析与源码详解⼀级缓存场景一场景二⼀级缓存原理探究…

Fiddler模拟弱网环境

1.设置弱网&#xff1a;Rules-》Customize Rules 上传速度&#xff1a;1KB/300ms1KB/0.3s3.33KB/s 下载速度&#xff1a;1KB/150ms1KB/0.15s6.67KB/s 2.启动弱网&#xff1a;Rules-》Performance-》Simulate Modem Speeds 开启后&#xff0c;此项为勾选状态 3.验证弱网生效…

推荐系统概述(PPT)

参考资料&#xff1a; 推荐系统系列之推荐系统概览&#xff08;上&#xff09; | 亚马逊AWS官方博客推荐系统系列之推荐系统概览&#xff08;下&#xff09; | 亚马逊AWS官方博客 目录如下&#xff1a; 推荐系统简介 推荐系统中常见概念 推荐系统中常用的评价指标 首页推荐…

C# Onnx 百度PaddleSeg发布的实时人像抠图PP-MattingV2

目录 效果 模型信息 项目 代码 下载 效果 图片源自网络侵删 模型信息 Inputs ------------------------- name&#xff1a;img tensor&#xff1a;Float[1, 3, 480, 640] --------------------------------------------------------------- Outputs -----------------…

Linux运行jmeter报错java.sql.SQLException:Cannot create PoolableConnectionFactory

在性能测试过程中遇见1个问题&#xff0c;终于解决了&#xff0c;具体问题如下。 问题 在windows电脑写jmeter脚本连接数据库连接成功 然后把该脚本放到Linux服务器上面&#xff0c;并把jmeter mysql驱动放到服务器上面&#xff0c;修改jmeter的mysql驱动路径信息 注意&…