[shell详细知识点]

Shell

shell定义

 Shell 是一种程序设计语言,他有变量,关键字,各种控制语句和自己的语法结构,
可以编写功能很强,代码简短的程序​#!  Shebang     定义解释器#!/usr/bin/python#!/bin/bash

shell分类

 /bin/sh/bin/bash/sbin/nologin/usr/bin/sh/usr/bin/bash/usr/bin/nologin​默认shell : bash shell​查看当前使用的shellecho $SHELL​shell的切换vim /etc/passwd     编辑登录shell
bash配置文件
开机执行/etc/rc.loacl​全局配置文件登录执行/etc/profile/etc/profile.d/*.sh/etc/bashrc​个人配置文件~/.bash_profile -----离开时执行~/.bashrc​登出加载的配置文件~/.bash_logout​登陆式shell加载配置文件的过程~/.bash_profile ---> ~/.bashrc ---> /etc/bashrc ---> /etc/profile ---> /etc/profile.d/*.sh​非登录式shell加载配置文件过程~/.bashrc ---> /etc/bashrc ---> /etc/profile.d/*.sh​profile类的文件 : 设定环境变量运行命令或脚本​bashrc类的文件定义命令别名
通配符
Shell 通配符*   ?   []  {}* : 匹配所有的字符​? : 匹配任意一个字符​[] : 匹配[]中的任意一个字符​[!0-9] : 匹配除了[]中的任意字符不能是数字​{} : 匹配{}中其中一个字符串​

Shell脚本规范

 定义解释器#!/bin/bash#! Shebang​执行方式sh bash     创建子shell执行脚本,脚本的环境变量和环境设置不会影响当前环境.   source  父shell亲自执行脚本,脚本可以改变当前的环境设置和变量./  需要执行权限​脚本测试sh -x   显示所有的变量值sh -n   检查脚本的语法是否有错误    ​sh 和 source的区别:sh:当使用sh来执行脚本时,它会创建一个新的子进程来执行脚本,
并且脚本中的变量和环境设置通常不会影响当前的shell环境source:使用source或.来执行脚本文件时,脚本中的命令会在当前Shell环境中执行,
并且脚本可以修改当前Shell的变量和环境设置。

shell变量

预定义变量
 $?  最后一次执行的命令的返回状态$$  当前进程的进程号$!  后台运行的最后一个进程的进程号$#  位置参数的数量$@  所有位置参数的内容$*  所有位置参数的内容
自定义变量
 自定义变量定义 : 变量名称=值变量名称 : 只能有字母,数字.下划线组成,不能以数字开头,-波折号=赋值符号前后不能有空格 引用变量 : $变量名 或者 ${变量名}​查看变量 :echo $变量名 set (所有变量 : 包括自定义变量)env (环境变量)​取消变量 :unset 变量名 仅在当前shell中有效​作用范围 :仅在当前shell中生效
环境变量
环境变量shell在开始执行时已经定义好的env 查看所有的环境变量set 查看所有变量环境变量拥有可继承性 : export之后就拥有继承性export 查看变量export 变量名=变量值  env常用的环境变量USER UID HOME HOSTNAME PWD PS1  PATH    PATH : 存储所有命令所在的路径
变量运算
变量运算算式运算符+  -  *  /   %取余      () 运算方式$(()) $[] expr 运算符号左右要有空格 '*'或\*$RANDOM 随机数eg:$(())# echo $(( 5+2-(3*2)/5 )) 6$[]# echo $[ 5 + 2 - (3*2)/5 ]6   expr# expr 5 + 3浮点运算bash不能做小数计算:需要bc命令转换"scale=10;3/10" | bc -lscale : 精确值bc -l : 数学库
变量的引用
转义 : \一个字符被引用时,其特殊含义被禁止"" 弱引'' 强引\n 换行   \t 制表符 \a 蜂鸣read  -p    打印提示信息-t    超时时间-s    取消回显
变量替换
   ${a:-xx}    若a为空或未设置,则用xx代替a进行替换,a的值不变 read -p "请输入你要符的值:" numecho ${num:-hello}echo $num[root@localhost ~]# sh test.sh 请输入你要符的值:111[root@localhost ~]# sh test.sh 请输入你要符的值:hello​[root@localhost ~]# ${a:=xx}    若a为空或未设置,则用xx代替a进行替换,a的值改变为xx read -p "请输入你要符的值:" numecho ${num:=hello}echo $num[root@localhost ~]# sh test.sh 请输入你要符的值:111[root@localhost ~]# sh test.sh 请输入你要符的值:hellohello[root@localhost ~]# ${a:+xx}    若a设置了,则用xx代替a进行替换,a的值不变,a没设值,则为空read -p "请输入你要符的值:" numecho ${num:+hello}echo $num[root@localhost ~]# sh test.sh 请输入你要符的值:1hello1[root@localhost ~]# sh test.sh 请输入你要符的值:​​[root@localhost ~]# ${a:?xx}    若a为空或未设置,则xx作为标准错误打印出来,这可用来检查变量是否正确设置
匹配截取
${变量#关键词} 变量内容从左边开始符合关键词则将符合的最短数据切除${a#*.}     切掉首个.左边的所有内容z​${变量##关键词} 变量内容从左边开始符合关键词则将符合的最长数据切除${a##*.}    切掉最后.左边的所有内容​${变量%关键词}  变量内容从右边开始符合关键词则将符合的最短数据切除${a%.*}     切掉首个.右边的所有内容​${变量%%关键词} 变量内容从右边开始的数据符合关键词则将符合的最长数据切除${a%%.*}    切掉最后.右边的所有内容​${变量/旧字符串/新字符串/} 变量内容符合旧字符串则将第一个旧字符串替换位新字符串​${变量//旧字符串/新字符串/} 变量内容符合旧字符串则将全部字符串替换位新字符串​tr -d "."echo $a | tr "."  "/"

shell流程控制

测试test 条件条件为真返回 0,条件为假返回 1[ 条件 ]test 能够理解3种类型的表达式 1.文件测试2.字符串比较3.数字比较字符串-n STRING# -n 字符串长度不为零-z STRING# -z  字符串长度为0STRING1 = STRING2# = 判断两个字符串是否一样STRING1 != STRING2# != 判断两个字符串是否不一样数字-eq 等于       -ne 不等于     -ge 大于等于    -le 小于等于   -gt 大于       -lt 小于      文件test-f 存在且是普通文件  # 重要-d 存在且是目录  #-h 存在且是符号链接 -b 块设备-c 字符设备-e 文件存在  #-a  &&  逻辑与 and 两端的条件都可以成立-o  ||  逻辑或 or  两端的条件有一段成立就行  if语句格式if[判断条件];thenelifelseifcase语句格式case $变量 in模式1);;模式2);;*);;esac
for语句
for i in {范围}for关键词 i变量名 in关键词  取值范围格式(空格,制表符 换行)do循环体done​99乘法表for i in {1..9}dofor j in `seq $i`doecho -ne "${j}x${i}=$[$i * $j]\t"doneecho ""donefor i in `cat a.txt`do循环体 echo '$i'done
while语句
 方式一:​while 条件while 关键字  条件  [ $1 -lt 10 ] ,while循环,条件为真的情况下,会循环do循环体done方式二:将文本内容交给while循环,以行为单位处理,最后一行需要换行(windos创建的文件)while read linedo循环体done < /文本路径方式三 : 将文本内容交给while循环cat aaa.txt | while read linedo循环体done eg : yum -y install `cat a.txt` | while read linedoecho "anzhuagn $line"done
until语句
 until 条件 # 当后面的条件表达式,为假的时候进行循环,当他为真了就停止循环了。do循环体done​eg : a=0until [ $a -gt 10 ]dolet a++echo $adone
循环控制
 shift将位置参数左移一位break结束退出本次循环continue在循环中不执行continue下面的代码,转而进入下一轮循环exit退出脚本

函数

 function 完成特定功能的代码片段函数必须先定义才能使用优点:避免重复的代码unset 函数名 ---->取消函数​eg: function_name () {list of commands}函数名 function_name,使用它从其他地方在脚本调用。 
tput setab [1-7]---设置背景颜色tput setaf [1-7]----设置字体颜色tput sgr0 ---- 重置颜色

属组

books=( linux shell awk sed )  ​取出所有的元素echo ${books[@]}​取出所有的索引echo ${!books[@]}​取出索引的个数echo ${#books[@]}​在数组中增加元素books[4]="mysql"​修改数组中的某个值books[0]="grep"​删除数组中的某个元素unset books[0]
关联数组需要提前声明
 declare -A my​my=([name]=newrain  [sex]=man  [age]=26)​echo ${my[name]}==>newrain​echo ${my[age]}==>26​echo ${!my[@]}
shell属组中"*"和"@"区别
 关于在shell脚本中数组变量中 “*”跟 “@” 区别“*”当变量加上“” 会当成一串字符串处理. “@”变量加上“” 依然当做数组处理. 在没有加上“” 的情况下 效果是等效的.
基本正则表达式:(grep支持)
 元字符示例                      功能^                       行首定位符^love ​$                       行尾定位符love$ ​.                       匹配单个字符l..e  ​*                       匹配前导符0到多次 全部匹配 grep "o*" /etc/passwdab*love ​.*                      匹配任意多个字符  (贪婪匹配​[]                      匹配方括号中任意一个字符[lL]ove​[ - ]                   匹配指定范围内的一个字符[a-z0-9]ove             ​[^]                     匹配不在指定组里的字符[^a-z0-9]ove ​\                       用来转义元字符love\.                  ​\<                      词首定位符 #由数字或字母组成的\<love​\>                      词尾定位符love\>​\(\)                    匹配后的标签   # 在vim中测试:%s@\(张三\) \(李四\) \(王五\)@ \3 \1 \2@g
拓展正则表达式:(grep -E,grep -P,egrep)
= 等于 != 不等于  =~  匹配扩展正则表达式元字符+                       匹配一个或多个前导字符[a-z]+ove​?                       匹配零个或一个前导字符 lo?ve"r.*t"                  贪婪匹配-P "r.*?"               非贪婪匹配​a|b                     匹配a或blove|hate​()                      组字符loveable|rslove(able|rs) ov+ ov+ (ov)+ (oo)+                   两个oo出现一次或者多个​(..)(..)\1\2            标签匹配字符  #(love)able\1er​x{m}                    字符x重复m次o{5}o{,3}                   字符最多出现3次x{m,}                   字符x重复至少m次o{5,}                   字符最少出现5次​x{m,n}                  字符x重复m到n次o{5,10}​grep -E "o{3}"  /etc/passwdgrep -P "\s" /etc/passwd  空格grep -P "\d" /etc/passwd  数字
shell里面的多行注释:
 shell里面的多行注释:​<!​........​!
grep
 grep -E 支持拓展正则表达式grep -E "o{3}"  /etc/passwd​grep -P 支持拓展正则表达式grep -P "\s" /etc/passwd  空格grep -P "\d" /etc/passwd  数字​grep -v  :取反​ps -ef | grep nginx | grep -v grep​grep -i : 忽略大小写​grep -i "ROOT" /etc/passwd​grep -c :统计次数​grep -i -c"ROOT" /etc/passwd​grep -o :只显示匹配到的内容​grep -o "root" /etc/passwd​grep -F|fgrep 精准匹配,不支持任何的特殊字符​fgrep "[shell]" /opt/passwd ==>看到什么过滤什么 不用考虑正则表达式​grep -r 递归过滤
sed
前面两个斜杠中是要匹配的内容,可以使用正则,后面两个斜杠中间,是要替换的内容,是纯文本将表准输出| sed 参数 模式​sed  's/要替换的内容/替换后的内容/'  file.txt​sed -f 指定一个脚本文件来处理文档,需求多的时候​sed -n 阻止输入行输出​sed -r 可以匹配到扩展正则​sed -p 打印
在文件中匹配到的删除:
sed '1d' file.txt 删除文件第一行​sed '1,2d' file.txt 删除文件的第一行到第二行​sed '2,$d' file.txt 删除第二行到最后一行​sed '/root/d' file.txt 匹配到root行,删除该行​sed '/关键字/,$d' 删除关键字所在的行到最后一行的内容​sed '1,/关键字/d' 删除第一行到关键字所在的行​sed '/关键字/,/下一个关键字/d' 删除两个关键字所在行以及中间的行​sed '/root/,2d'  file.txt 匹配到root行,到第二行,删除​sed '/^$/d' file.txt 删除空行​sed '/#.*/d' file.txt 删除注释行​sed '1~2d' file.txt 删除奇数行​sed '0~2d' file.txt 删除偶数行​sed '3d;10d' file.txt 删除第三行和第十行
在文件中匹配到的部分修改文件:
sed -i 's/odler/new/g'   "-i"修改后的数据会替换原文件,"-g"全局替换​sed -i.bak 's/older/new/'  在替换前会生成一个备份文件
在文件中匹配到的部分前后加上一行:
 sed '/^bin/a\hello nihao/' passwd  # 在匹配到开头为bin的行下一行插入内容​sed '/^bin/i\hello nihao/' passwd  # 在匹配到开头为bin的行上一行插入内容

案例

 修改ssh服务配置文件1、拒绝root用户远程登录#PermitRootLogin yesPermitRootLogin no​sed -r 's/#PermitRootLogin.*/PermitRootLogin=no/g'​2、修改端口为22   2222#Port 22Port 2222​/#Port 22/a\Port 2222​3、修改dns反解析为no #UseDNS yesUseDNS no​/#UseDNS/a\UseDNS=no/#UseDNS/d​2.修改nginx的配置文件1、修改端口为88  listen 80;listen [::] 80;sed -r 's/Listen\s+[0-9]{2}\;/listen 88;/i' /etc/nginx/nginx.conf2.修改网站根目录为/opt/websed -r 's/^[^#]\s+root\s+\/usr\/share\/nginx\/html\;/     root   \/opt\/web;/' /etc/nginx/nginx.confsed -r s///root /usr/share/nginx/html;#   root /usr/share/nginx/html;/^[^#]\s+root\s+\/usr\/share\/nginx\/html\;/root \/opt\/web;/3.修改selinux的配置将selinux设置为永久关闭sed -r 's/^SELINUX=.*/SELINUX=hello/' /etc/selinux/config 
awk
 切割字段​awk 参数 模式 文件​将标准输出|awk 参数 模式​awk BEGIN{开始处理数据前的操作,只执行一次}{处理数据的操作,文本有多少行执行多少次}END{数据处理完成以后的操作,执行一次}参数-F 指定分隔符FS      指定输入字段分隔符       空格和tabOFS     指定输出字段分隔符       空格和tabRS      指定输入记录分隔符       换行ORS     指定输出记录分隔符       换行NR      行号NF      列数FNR     不同文件各自显示行号

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

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

相关文章

python - Pandas缺失值处理

文中所用数据集已上传,找不到的可以私聊我 学习目标 知道空值和缺失值的区别以及缺失值的影响 知道如何查看数据集缺失值情况的方法 知道缺失值处理的办法 1 NaN简介 好多数据集都含缺失数据。缺失数据有多种表现形式 数据库中&#xff0c;缺失数据表示为NULL 在某些编程语…

java基本数据类型变量间的运算规则及String类的使用

数据类型变量间的运算规则&#xff1a; 1、可以做运算的基本数据类型有7种&#xff0c;不包含boolean类型&#xff1b; 2、运算规则&#xff1a; 1、自动类型提升&#xff08;当容量小的变量与容量大的变量做运算时&#xff0c;结果自动转换为容量大的数据类型。ps:在这里容量…

【C语言】宏详解(上卷)

前言 紧接着预处理详解&#xff08;上卷&#xff09;&#xff0c;接下来我们来讲宏&#xff08;隶属于预处理详解系列&#xff09;。 #define定义宏 #define机制包括了一个规定&#xff0c;允许把参数替换到文本中&#xff0c;这种实现通常称为宏&#xff08;macro&#xff…

AI如何创造情绪价值

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。从智能家居到自动驾驶&#xff0c;从医疗辅助到金融服务&#xff0c;AI技术的身影无处不在。而如今&#xff0c;AI更是涉足了一个全新的领域——创造情绪价值。 AI已经能够处…

2024年【天津市安全员C证】免费试题及天津市安全员C证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证免费试题是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】免费试题及天津市…

分享美好,高清无阻 - 直播极简联网解决方案

1、需求背景 随着移动互联网、UGC模式和直播平台的发展&#xff0c;网络直播的门槛日益降低&#xff0c;越来越多的人希望成为直播的主角。基于物联网的户外直播无线联网解决方案应运而生&#xff0c;满足直播者的需求。 户外直播无线联网解决方案提供了无处不在的直播体验&a…

SpringBoot与MyBatis的快速整合(基于注解)

文章目录 创建Spring Boot项目配置数据库连接信息编写MyBatis Mapper接口使用XML文件编写SQL映射配置数据源切换引入Druid依赖配置Druid数据源 配置MyBatis支持事务管理 在使用Spring Boot创建新项目或新模块时&#xff0c;如果需要使用MyBatis来进行数据库操作&#xff0c;可以…

可变类型与不可变类型在命名空间中的一些场景

在Python中&#xff0c;变量空间的概念通常指的是变量在内存中的存储位置。可变类型和不可变类型在变量空间中的表现确实会导致一些常见的误解和错误。以下是一些具体的例子&#xff1a; ### 1. 可变类型作为函数参数 当你将可变类型&#xff08;如列表&#xff09;作为参数传递…

js的锚点

本文描述js的锚点解释及使用方法: 在Web开发中&#xff0c;锚点&#xff08;Anchor&#xff09;通常用于创建页面内的链接&#xff0c;允许用户点击链接直接跳转到同一页面的不同部分。JavaScript可以用来增强锚点的功能&#xff0c;例如实现平滑滚动或动态修改锚点行为。以下…

Python面试宝典:Python中与数据科学概念相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第二十六章:Python与数据科学:第一节:数据科学】 第二十六章:Python与数据科学第一节:数据科学python中与数据科学概念相关的面试笔试题面试题1面试题2面试题3面试题4面试题5更多面试…

uniapp实现微信小程序调用云函数【vue2】

在uniapp中的vue 2框架中想要改变默认的目录结构&#xff0c;将装有云函数的文件夹在运行后一起复制到unpackage 文件下&#xff0c;主要用 copy-webpack-plugin 方法来实现&#xff0c;具体步骤如下&#xff1a; 一、创建一个vue 2 框架的uniapp 二、新建一个文件夹装云函数 …

Git【版本控制命令】

02 【本地库操作】 1.git的结构 2.Git 远程库——代码托管中心 2.1 git工作流程 代码托管中心用于维护 Git 的远程库。包括在局域网环境下搭建的 GitLab 服务器&#xff0c;以及在外网环境下的 GitHub 和 Gitee (码云)。 一般工作流程如下&#xff1a; 1&#xff0e;从远程…

轻松掌握系统概况,提升工作效率

作为 Linux 系统管理员,我们经常需要了解系统的基本状况,比如当前时间、系统版本、内核信息、CPU 型号、内存使用等等。但是每次手动执行各种命令来获取这些信息,无疑是一件非常繁琐的事情。 幸运的是,我们可以通过编写一个简单的 shell 脚本来一键获取这些系统信息。让我们一…

Java 环境配置 -- Java 语言的安装、配置、编译与运行

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 002 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

【iOS】内存泄漏检查及原因分析

目录 为什么要检测内存泄漏&#xff1f;什么是内存泄漏&#xff1f;内存泄漏排查方法1. 使用Zombie Objects2. 静态分析3. 动态分析方法定位修改Leaks界面分析Call Tree的四个选项&#xff1a; 内存泄漏原因分析1. Leaked Memory&#xff1a;应用程序未引用的、不能再次使用或释…

我的编程语言学习记录:一段不断探索的旅程

目录 我的编程语言学习记录&#xff1a;一段不断探索的旅程 1.引言 2.我的编程之旅开始 第一站&#xff1a;Python — 简洁之美 第二站&#xff1a;JavaScript — 网页的魔法 第三站&#xff1a;Java — 企业级的力量 3.学习过程中的挑战与克服 1.理解概念 3.记忆语法…

牛客网刷题 | BC118 N个数之和

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 输入数字N&#xf…

Servlet-01

文章目录 Servlet创建Servlet探究Servlet的生命周期 HttpServletWebServlet注解详解 重定向与请求转发ServletContextServletContext中的接口 HttpServletRequestHttpServletResponse状态码解释Cookie Servlet Q&#xff1a;它能做什么呢&#xff1f; A&#xff1a;我们可以通…

Hadoop3:MapReduce源码解读之Map阶段的数据输入过程整体概览(0)

一、MapReduce中数据流向 二、MapTask并行度 1、原理概览 数据块&#xff1a;Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位。 数据切片&#xff1a;数据切片只是在逻辑上对输入进行分片&#xff0c;并不会在磁盘上将其切分成片进行存储。数据切片是MapRed…

XUbuntu24.04之ch9344(usb转串口芯片)安装驱动(二百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…