shell编程基础笔记

目录

echo改字体颜色和字体背景颜色

bash基本功能:

运行方式:推荐使用第二种方法

变量类型

字符串处理:

条件判断:(使用echo $?来判断条件结果,0为true,1为false)

条件语句:

循环语句

特殊流程控制语句

read读取控制台输入

函数

数组:

切片


部分图片截取自【尚硅谷Linux系统管理教程(linux系统管理精讲)】https://www.bilibili.com/video/BV1ut411a7ro?vd_source=4aa5c9ca48e929b37821b89859f00208B仅供学习使用,感谢!

echo改字体颜色和字体背景颜色

bash基本功能:

 ①。查看历史输入命令history,最大存储在磁盘1000条,可进入/etc/profile进行修改HISTSIZE=1000,进行扩充;

补充:可以使用上下箭头进行历史命令的切换,也可以使用“!历史命令行号”

 ②。命令改别名alias,进入/root/.bashrc可进行修改,使用source /root/.bashrc进行更新,可使用“unalias  别名”进行删除

加入--color=auto显示颜色

 ③。错误输出重定向追加保存:“错误命令  2>> 文件”(只能保存错误命令)

正确输出和错误输出同时重定向追加保存:“命令  >> 文件    2>&1/    "命令  &>> 文件"

         分别保存正确错误文件:“命令>>文件 2>>文件2

④。多命令顺序执行:

1)。“;”    顺序执行多命令并结果互不影响

2)。“&&” 前者正确,执行后者

3)。“ || ”   前者错误,执行后者

⑤。bash中其他特殊符号(重点注意)

 ‘’单引号,所见即所得,不能在单引号内再使用单引号。

 “”双引号,拥有“调用变量的值”,“引用命令”,“转义字符”的特殊含义,双引号可以嵌套单引号,但不能直接嵌套双引号或反引号。

    ``     反引号,其括起来的内容是系统命令,可以调用系统命令将结果赋值给一个变量例如:a=`ls /root`

   $()  和反引号作用一样,用来引用系统命令。(推荐使用)

   ()   用于一串命令执行时,()中的命令会在子shell中运行(相当于执行局部变量)

   {}   用于一串命令执行时,{}中的命令会在当前shell中执行,也可以用于变量变形与替换 (相当于执行全局变量

⑥。bash快捷键

查看系统所有快捷键:stty   -a

修改系统快捷键:stty   关键字     快捷键

运行方式:推荐使用第二种方法

①.bash/sh + 绝对/相对路径

.赋予执行权限chmod +x  文件,以后可以直接用路径调用不需要加bash/sh(相对路径要加./

③.脚本路径前加".空格"或者source

变量类型

①.预定义变量

$?     功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0(具体实施那个数,有命令自己来决定),则证明上一个命令执行不正确

$$        查看当前进程的进程号(PID)

$!         后台运行的最后一个进程的进程号(PID

②。环境变量

常用系统变量$HOME ,$PWD,$SHELL,$USER

查看系统变量值:echo $HOME

1)。PATH:系统查找命令的路径

PATH变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入一个程序名,如果没有写入路径,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误

自已定义的脚本也可以通过将脚本复制到PATH变量定义的路径中,或者使用PATH=$PATH:/root/sh修改PATH变量的值进行叠加,就可以不输入路径而直接运行

2)。PS1变量:命令提示符设置

PS1,是用来定义命令行的提示符,可以按照我们自己的需求来定义自己喜欢的提示符,PS1支持以下这些选项

3)LANG语系变量

LANG变量定义了Linux系统的主语系环境,这个变量的默认值

可以使用locale -a | more来查看支持的语系

4)环境变量配置文件调用过程

③。位置参数变量

特殊变量

$n         功能描述:n为数字,$0代表脚本名称,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}

$#         功能描述:获取所有输入参数个数,常用于循环
$*       功能描述:这个变量代表命令行中的所有参数,$*把所有的参数看成了一个整体

$@     功能描述:这个变量也代表命令行中的所有参数,不过$@把每一个参数区分对待

举例

④.自定义变量

基本语法:

定义变量:变量名=变量值,注意=前后不能有空格(定义变量不需要加$,调用变量需要给变量前加$

撤销变量:unset   变量名

声明静态变量:readonly 变量,注意:不能unset

使用“export 变量(declare -x  变量)”可以把变量升级为全局(环境)变量,供其他变量使用(例如将父shell继承给子shell)

变量连接:变量=“$变量”连接值

变量定义规则:

变量名称由字母,数字,下划线组成,不能以数字开头,环境变量建议大写

等号两侧不能有空格

在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

变量的值如果有空格,需要使用双引号和单引号括起来

字符串处理:

①。cut列提取命令

  cut    [选项]    文件名

选项:

-d 分隔符:按照指定分隔符进行分列

-f   列号:提取第几列,一般与-d联用,cut命令的默认分隔符为制表符tab键,不对空格支持

-c  字符范围: 不依赖分隔符来区分列,而是通过字符范围(行首为1)来进行字段提取。“n-”表示从第n个字符到行尾;“n-m”从第n个字符到第m个字符;“-m”表示从第一个字符到第m个字符。

②。  Awk

列数表示直接为"$数字"

可以使用“-F 分隔符”来进行分割,注意引号的使用

 

1)。printf  输出

2)。 awk基本使用      awk   ‘条件1  {动作1}  条件2  {动作2}….’   文件名      (动作写在{}中,转义字符和字符串需要用“”括起来,

awk解决cut不能处理的空格问题

3)awk内置变量

注意:当使用FS时,可能第一行没有起作用,可能是需要加BEGIN条件

③。sed命令

列数表示直接为数字

sed命令主要是用来将数据进行选取,替换,删除,新增的命令

格式:sed    [选项]    '[动作]'    文件名

注意:1)如果想追加或插入多行数据,除最后一行外,每行的末尾都要加入“\”代表数据未完结;

2)-d只有行删除,没有具体的字符串删除功能,可以使用s将字符串替换为空,即可达到删除字符串的效果

3)多条动作之间要用“;”号或回车进行分割(一般与-e配合使用),当使用-e对多条命令进行编辑时,要与命令紧挨使用,中间不能有其他选项

4)指定行范围可以用“,”例如1,3表示第一行到第三行

④。排序命令sort

格式:sort    [选项]   文件名

补充:-k     指定字段号,一般与-t搭配使用,当-t分割后可以选择指定字段号;“-k  3”表示从第三个字段到行尾排序

⑤。uniq命令

uniq命令是用来取消重复行,其实和“sort  -u”是一样的

格式:uniq   [选项]   文件名

选项:-i: 忽略大小写

⑥。统计命令wc

格式:wc  [选项]   文件名

选项:-l:   只统计行数

-w :只统计单词数

-m:只统计字符数

条件判断:(使用echo $?来判断条件结果,0true1false

基本语法:①.test  判断条件

.[ 判断条件 ]           (注意条件前后距离[]要有空格,等号前后也要有空格)

常用判断条件:

.两个整数之间比较

②.按照文件权限进行判断

③.按照文件类型进行判断

④.两个文件之间进行比较

⑤。字符串比较

⑥。多重条件比较

条件语句:

注意:条件判断式不用再额外加中括号,例子多加了一层中括号

①.if判断基本语法:

单分支:

 if   [ 条件判断式 ];then

 程序

 fi

或者

 if [ 条件判断式 ]

 then

       程序

 fi

多分支:

 if [ 条件判断式 ]

 then

       程序

 elif [ 条件判断式 ]

 then

       程序

 else

程序

 fi

注意事项:[   条件判断式   ],中括号和条件判断式之间必须要有空格,if后要有空格

②.case语句基本语法

 case   $变量名 in

“值1”)

如果变量的值等于值1,则执行程序1

;;

 “值2”)

如果变量的值等于值2,则执行程序2

;;

………..省略其他分支

 *)

如果变量的值都不是以上的值,则执行此程序

;;

 esac

注意事项:①case行尾必须为单词“in”,每一行模式匹配必须以右括号“)”结束

②双分号“;;”表示命令序列结束,相当于break

③最后的“*)”表示默认模式,相当于default

循环语句

并发控制(补充)

&   将程序放置后台运行

Wait    允许脚本等待一个或多个后台进程完成

一种做法:

for语句

      do {

循环体

}&

Wait

①for循环基本语法:

 for((初始值;循环条件控制;变量变化))

 do

          程序

 done

 ② for in循环基本语法:

 for 变量  in  值1 值2 值3……

 do

程序

 done

③$*,$@基本语法:两个均代表命令行中的所有参数,$*将所有参数看成一个整体,$@把每个参数区分对待

比较:$*,$@都表示传递给函数或脚本的所有参数,不被双引号包含时,都以$1 $2 $3…..的形式分开输出所有参数;

 当它们被双引号包含时,$*会以“$1 $2 $3….”按整体的形式输出所有参数,$@以$1 $2 $3…..的形式分开输出所有参数

④,while/until循环基本语法

while只要条件判断式不成立时跳出循环

until只要条件判断式成立则跳出循环

 while/until [ 条件判断式 ]

 do

         程序

 done

特殊流程控制语句

①,exit语句

系统的exit命令,是用于退出当前用户的登陆状态;

在shell脚本中,exit语句是用来退出当前脚本的,只要碰到exit语句,后续的程序就不再执行

语法:exit  [返回值]

可以使用$?来查看exit的返回值

②,break和continue

read读取控制台输入

基本语法:read     (选项)  (参数)

选项:-p:指定读取值时的提示符;

  -t:指定读取值时等待的时间 (秒)。

  -n:   指定接受的字符数

  -s:   隐藏输入的数据

参数:

变量:指定读取值的变量名

注意:字符串比较时,等号前后要有空格,否则计算机会识别为赋值语句,定义变量时不要有空格

若输入错误可以ctrl+退格键删除

函数

系统函数

①basename

 基本语法:basename [string/pathname] [suffix]

 功能描述:basename命令会删掉所有的前缀包括最后一个("/")字符,然后将字符串显示出来。

 选项:suffix为后缀,如果suffix被指定了,basename会将pathname或suffix去掉

②dirname

Dirname  文件绝对路径

功能描述:dirname命令会获取所有的前缀路径

自定义函数

基本语法

[function]  函数名()

{

函数体;

[return int;]

}

经验技巧:

①。必须在调用函数地方之前,先声明函数,shell脚本是逐步运行的,不会像其他语言一样先编译

②,函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令结果作为返回值,return后跟数值n(0-255)

数组:

注意:查看和引用数组时需要加{}包裹数组

 

①,定义数组

数组名=(元素1  元素2  元素3,元素n)

数组名[下标]=变量值

元素定义示例:

②,查看数组

declare   -a  |grep   目标数组

③,访问数组

④,关联数组

功能:自定义索引;

语法:先声明关联数组

  declare  -A  关联数组名

  数组名=([自定义数组名1]=值1  [自定义数组名2]=值2 ………..)

  people=([p1]=li [pi2]=wang [p3]=zhang [p4]="ni ba")  

切片

格式:{变量名:起始索引:步长}    (注意:步长省略则是截取到末尾,$后面一定要加{})

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

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

相关文章

通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析

目录 一、序列标注(Sequence Tagging)二、命名实体识别(Named Entity Recognition,NER)**命名实体识别的作用****命名实体识别的常见实体类别** : 三、标签类型四、序列标注的三种常见方法1. **BIO&#xf…

wareshark分析mysql协议的数据包

使用wareshark 分析mysql协议的数据包,是每个dba都应该掌握的技能,掌握以后,就可以通过tcpdump抓包分析,得到连接报错的信息了。 tcpdump抓包命令: tcpdump -nn -i bond0 dst 10.21.6.72 and port 4002 -w 1129_tcpdu…

Shell脚本小练习

学习了这么长时间Shell脚本,总得来一次小小的练习吧,那么请看下文! 1.用Shell写一个小计算器。 通过read命令获取用户输入的表达式,表达式的格式设定为操作数1 运算符 操作数2,例如53,然后利用设计的脚本…

leetcode102:二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2: 输入&a…

《操作系统 - 清华大学》6 -3:局部页面置换算法:最近最久未使用算法 (LRU, Least Recently Used)

文章目录 1. 最近最久未使用算法的工作原理2. 最近最久未使用算法示例3.LRU算法实现3.1 LRU的页面链表实现3.2 LRU的活动页面栈实现3.3 链表实现 VS 堆栈实现 1. 最近最久未使用算法的工作原理 最近最久未使用页面置换算法,简称 LRU, 算法思路&#xff…

3. STM32_串口

数据通信的基础概念 什么是串行/并行通信: 串行通信就是数据逐位按顺序依次传输 并行通信就是数据各位通过多条线同时传输。 什么是单工/半双工/全双工通信: 单工通信:数据只能沿一个方向传输 半双工通信:数据可以沿两个方向…

Postman设置接口关联,实现参数化

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这…

Redis设计与实现 学习笔记 第二十二章 二进制位数组

Redis提供了SETBIT、GETBIT、BITCOUNT、BITOP四个命令用于处理二进制位数组(bit array,又称“位数组”)。 SETBIT命令用于为位数组指定偏移量上的二进制位设置值,位数组的偏移量从0开始,而二进制位的值可以是0或1&…

Linux服务器安装Linux宝塔面板部署wordpress网站以及雷池WAF

一、Linux服务器安装Linux宝塔面板 这个步骤参考网上其他教程。 二、Linux宝塔面板部署wordpress网站 这个步骤参考网上其他教程,保证网站能够正常访问,并且使用Linux宝塔面板申请并部署了SSL证书,使用https协议正常访问。 三、Linux宝塔…

C++学习日记---第14天(蓝桥杯备赛)

笔记复习 1.对象的初始化和清理 对象的初始化和清理是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题 构造函数&…

算法编程题-煎饼排序 不含AAA或者BBB的字符串

算法编程题-煎饼排序 &&不含AAA或者BBB的字符串 煎饼排序原题描述思路简述代码实现复杂度分析 不含AAA或者BBB的字符串原题描述思路简述代码实现复杂度分析 摘要:本文将对两道LeetCode原题进行介绍,分别是煎饼排序和不含AAA或者BBB的字符串。在陈…

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…

Vue进阶之单组件开发与组件通信

书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel&#xff0…

scss文件内引入其他scss文件报错

在 Sass (SCSS) 中,import 语句用于在当前文件中导入其他 Sass 文件,以便你可以重用样式和变量等。然而,从 Dart Sass 1.23.0 版本开始,import 语句已经被标记为弃用(deprecated),并计划在未来的…

Unity3D模型场景等测量长度和角度功能demo开发

最近项目用到多段连续测量物体长度和角度功能,自己研究了下。 1.其中向量角度计算: 需要传入三个坐标来进行计算。三个坐标确定两条向量线段的方向,从而来计算夹角。 public Vector3 SetAngle(Vector3 p1, Vector3 p2,Vector3 p3) { …

【MATLAB】基于RSSI的蓝牙定位与例程,设置4个基站、二维定位

目录 ​编辑 商品描述 主要功能 技术细节 适用场景 下载链接 商品描述 这款基于接收信号强度指示(RSSI)原理的蓝牙定位程序,专为需要高效、可靠定位解决方案的开发者和研究人员设计。它能够在二维平面内,通过4个锚点实现对未…

【学习笔记】基于RTOS的设计中的堆栈溢出(Stack Overflow)-第1部分

本文由RTOS专家Jean J. Labrosse撰写。 基于RTOS的应用程序中的每个任务都需要自己的堆栈,堆栈的大小取决于任务的要求(例如,函数调用嵌套、传递给函数的参数、局部变量等)。 为了避免堆栈溢出,开发人员需要过度分配堆栈空间,但不要太多,以避免浪费RAM。 什么是堆栈溢…

ROC曲线

文章目录 前言一、ROC的应用?二、使用方式1. 数据准备2.绘图可视化 前言 在差异分析中,ROC曲线可以用来评估不同组之间的分类性能差异。差异分析旨在比较不同组之间的特征差异,例如在基因表达研究中比较不同基因在不同条件或组织中的表达水平…

基数排序(代码+注释)

#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…