Shell脚本学习笔记(更新中...)
一、什么是shell
shell的作用是:
-
解释执行用户输入的命令程序等。
-
用户输入一条命令,shell就解释一条。
-
键盘输入命令,LInux给与响应的方式,称之为交互式。
shell是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入,解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给与用户看到结果。
从我们登录Linux, 输入账号密码到进入Linux交互式界面,所有的操作,都是交给shell解释并执行。
我们想要获取计算机的数据,不可能每次都编写程序,编译后,再运行,再得到我们想要的。例如你想找到一个文件,可以先写一段C语言的代码,然后调用系统函数,通过gcc编译后,运行程序才能找到文件。
因此有大牛开发shell解释器,能够让我们方便的使用Linux,例如只要桥下ls -lh 这样的字符串,shell解释器就会针对这句话翻译,解释成ls -l -h 然后执行,通过终端输出结果,无论是图形化或是命令行界面。
即使我们用的图形化,点的动作,却也只是
-
命令行操作,shell解释器执行后,输出结果到黑屏命令行界面。
-
图形化操作,shell接受点击操作,输出图案数据。
二、什么是Shell脚本
shebang 美/ʃɪˈbæŋ/ : n.工作;事情;住所
当命令或者程序语句写在文件中,我们执行文件,读取其中的代码,这个程序文件就称之为shell脚本。在shell脚本里定义多条linux命令以及循环控制语句,然后将这些Linux命令一次性执行完毕,执行脚本文件的方式称之为,非交互式方式。
-
windows系统中shell脚本:以".bat"结尾的批处理脚本文件。
-
Linux系统中shell脚本:以".sh"结尾的脚本文件。
shell脚本规则
在Linux系统中,shell脚本或者称之为(bash shell程序)通常都是vim编辑,由Linux命令、bash shell指令、逻辑控制语句和注释信息组成。
三、Shebang
计算机程序中,shebang指的是出现在文本文件的第一行前两个字符 #!。
在Unix系统中,程序会分析shebang后面的内容,作为解释器的指令,例如
-
以#!/bin/sh开头的文件,程序在执行的时候会调用 /bin/sh,也就是bash解释器。
-
以#!/usr/bin/python 开头的文件,代表指定python解释器去执行。
-
以#!/usr/bin/env 解释器名称,是一种在不同平台上都能正确找到解释器的办法。
注意事项:
-
如果脚本未指定shebang,脚本执行的时候,默认用户当前shell去解释脚本,即$SHELL。
-
如果shebang指定了可执行的解释器,如 /bin/bash /usr/bin/python ,脚本在执行时,文件名会作为参数传递给解释器。
-
如果 #! 指定的解释器程序没有可执行权限,则会报错“bad interpreter: Permission denied”。
-
如果#! 指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。
-
如果 #! 指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。
-
在 #! 之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会自动$PATH中寻找解释器的。
-
如果你使用“bash test.sh”这样的命令来执行脚本,那么 #! 这一行将会被忽略掉,解释器当然是用命令行中显示或指定的bash。
脚本案例如下:
[root@localhost opt]# cat test.sh #! /bin/bash ls . echo "脚本执行完毕~"
四、脚本注释,脚本开发规范
-
在shell脚本中,#后面的内容代表注释掉的内容,提供给开发者或使用者观看,系统会忽略此行。
-
注释可以单独写一行,也可以跟在命令后面。
-
尽量保持爱写注释的习惯,便于以后回顾代码的含义,尽量使用英文、而非中文
#! /bin/bash # Date: 2024-05-20 16:52 # Author: created by chengjiagnbo # blog: https://blog.csdn.net/u010132847?type=blog
五、执行shell脚本的方式
-
bash script.sh 或 sh scripte.sh ,文件本身没权限执行,没x权限,则使用的方法,或脚本未指定 shebang,重点推荐的方式。
-
使用 绝对/相对 路径执行脚本, 需要文件含有x权限。
-
source script.sh 或者 . script.sh ,代表 执行的含义, source等于点"." 。
-
少见的用法, sh < script.sh
[root@localhost opt]# ls test.sh [root@localhost opt]# sh < test.sh test.sh 脚本执行完毕~ [root@localhost opt]# bash test.sh test.sh 脚本执行完毕~ [root@localhost opt]# source test.sh test.sh 脚本执行完毕~ [root@localhost opt]# . test.sh test.sh 脚本执行完毕~
六、shell和运维
shell脚本语言很适合处理纯文本类型数据,且Linux的哲学思想就是一切皆文件,如果日志、配置文件、文本、网页文件,大多数都是纯文本类型的,因此shell可以方便的进行文本处理,好比强大的Linux三剑客(grep、sed、awk)。
6.1、脚本语言
shell脚本语言属于一种弱类型语言 无需声明变量类型,直接定义使用,数据类型默认都是字符串类型。
强类型语言,必须先定义变量类型,确定是数字、字符串等,之后再赋予同类型的值。
Centos7系统中支持的shell情况,有如下种类
[root@localhost opt]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
默认的sh解释器
[root@localhost opt]# ll /usr/bin/sh lrwxrwxrwx. 1 root root 4 Jan 29 12:03 /usr/bin/sh -> bash
6.2、其他脚本语言
PHP是网页程序语言,专注于Web网页开发,诸多开源产品,wordpress、discuz开源产品doushiPHP开发。
Perl语言,擅长支持强大的正则表达式,以及运维工具的开发。
Python语言,明星语言,不仅适用于脚本程序开发,也擅长Web页面开发,如(系统后台,资产管理平台),爬虫程序开发,大量Linux运维工具也由Python开发,甚至于游戏开发也是用。
6.3、shell的优势
虽然有诸多脚本变成语言,但是对于Linux操作系统内部应用而言,shell是最好的工具,Linux底层命令都支持shell语句,以及结合三剑客(grep、sed、awk)进行高级用法。
-
擅长系统管理脚本开发,如软件启停脚本、监控报警脚本、日志分析脚本
每个语言都有自己擅长的地方,扬长避短,达到高效运维的目的是最合适的。
#Linux默认shell [root@localhost ~]# echo $SHELL /bin/bash
七、bash基础特性
7.1、bash是什么
-
bash是一个命令处理器,运行在文本宽口中,并能执行用户直接输入的命令。
-
bash还能从文件中读取linux命令,称之为脚本。
-
bash支持通配符、管道、命令替换、条件判断等逻辑控制语句。
bash有诸多方便的功能,有助于运维人员提升工作效率。
7.2、命令历史
shell会保留其会话中用户提交执行的命令
history #命令,查看历史命令记录,注意【包含文件中和内存中的历史记录】 [root@localhost ~]# echo $HISTSIZE #shell进程可保留的命令历史的条数 1000 [root@localhost ~]# echo $HISTFILE #存放历史命令的文件,用户退出登录后,持久化命令个数 /root/.bash_history
history命令
history #命令 以及参数 -c: 清空内存中命令历史。 -r: 从文件中恢复历史命令 数字:显示最近n条命令 ,如history 10
7.3、特性汇总
文件路径tab健补全
命令补全
快捷键 ctrl + a,e,u,k,l
通配符
命令历史
命令别名
命令行展开
八、变量含义
学生时代所学的数学方程式, 如x=1,y=2, 那会称之为x, y是未知数。
对于计算机角度, x=1, y=2等于定义了两个变量,名字分别是x, y,且赋值了1和2。
变量是暂时存储数据的地方,是一种数据标记(房间号,标记了客人所在的位置),数据存储在内容空间,通过调用正确的变量名字,即可取出对应的值。
九、shell变量
9.1、变量定义与赋值,注意变量与值之间不得有空格
[root@localhost ~]# name = "波哥" -bash: name: command not found变量名 变量类型,bash默认把所有变量都认为是字符串。bash变量是弱类型,无需事先声明类型,是将声明和赋值同时进行。
9.2、变量替换/引用
[root@localhost ~]# name="波哥带你学bash" [root@localhost ~]# echo ${name} 波哥带你学bash [root@localhost ~]# echo $name #可以省略花括号 波哥带你学bash
9.3、变量名规则
-
名称定义要做到见名知意,切按照规则来,切不得引用保留关键字(help检查保留字)
-
只能包含数字、字母、下划线
-
不能以数字开头
-
不能用标点符号
-
变量名严格区分大小写
有效的变量名: NAME_BOGE _boge boge1 bogE1 Boge2_ge无效的变量名: ?boge bo*ge bo+ge
9.4、变量的作用域
作用域的理解(盒子的嵌套)
9.5、本地变量的识别
单引号变量,不识别特殊语法。 双引号变量,能识别特殊符号。
示例:
备注:echo: 美/ˈekoʊ/v.回响,发出回声;
9.6、不同的执行方式,不同的shell环境
示例:
解答:
-
每次调用bash/sh解释器执行脚本,都会开启一个子shell,因此不保留当前的shell变量,通过pstree命令检查进程树。
-
调用source或者点“.”符号,在当前shell环境加载脚本,因此保留变量。
备注:如果centos系统执行pstree命令时,碰到“-bash: pstree: command not found”, 则执行命令“yum -y install psmisc”安装。
9.7、一个面试题
问,如下输出的内容是什么
[root@localhost ~]# cat test.sh user=`whoami` [root@localhost ~]# sh test.sh [root@localhost ~]# echo $userA. 当前用户 B. 空[root@localhost ~]# source test.sh [root@localhost ~]# echo $userA. 当前用户 B. 空
备注:在linux中的反引号"`"命令执行结果会被保留下来。
十、环境变量设置
环量变量一般指的是用export内置命令导出的变量,用于定义shell的运行环境,保证shell命令的正确执行。
shell通过环境变量确定登录的用户名、PATH路径、文件系统等各种应用。
环境变量可以在命令行中临时创建,但是用户退出shell终端,变量即丢失,如果永久生效,需要修改环境变量配置文件
-
用户个人配置文件 ~/.bash_profile、~/.bashrc 远程登录用户特有文件。
-
全局配置文件 etc/profile、/etc/bashrc。系统建议最好创建在/etc/profile.d/, 而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户。
10.1、*检查系统环境变量的命令:
-
set: 输出所有变量,包括全局变量、局部变量。
-
env: 只显示全局变量。
-
declare: 输出所有的变量,如同set。
-
export: 显示和设置环境变量值。
10.2、撤销环境变量
-
unset 变量名,删除变量或函数。
10.3、设置只读变量
-
readonly, 只有shell结束,只读变量失效。
10.4、系统保留环境变量关键字
bash内嵌了诸多环境变量,用户定义bash的工作环境, 查看命令
[root@localhost ~]# export |awk -F '[ :=]' '{print $3}'
10.5、bash多命令执行
多条命令时用英文分号分开,如 [root@localhost home]# cd /;ls;cd /home;cd jiangbo;pwd
10.6、linux环境变量文件加载顺序
十一、特殊变量
11.1、shell的特殊变量,用在如脚本,函数传递参数使用
如下特殊的,位置参数变量
$0:获取shell脚本文件名,以及脚本路径。 $n: 获取shell脚本的第n个参数,n在1~9之间, 如$1, $2...$9, 大于9则需要写, ${10},参数空格隔开。 $#: 获取执行的shell脚本后面的参数总个数。 $*: 获取shell脚本所有参数,不加引号等同于$@作用,加上引号"$*"作用是 接收所有参数为单个字符串, “$1 $2... $@: 不加引号,效果同上,加引号,是接收所有参数为独立字符串, 如“$1” "$2" "$3" ..., 空格保留
示例:
[root@localhost ~]# cat test.sh #! /bin/bash echo '特殊变量 $0 $1 $2 ..的实践' echo '结果:' $0 $1 $2echo '######################' echo '特殊变量$# 获取参数总个数' echo '结果:' $#echo '######################'echo '特殊变量$@ 实践' echo '结果:' $@ [root@localhost ~]# sh test.sh jiangbo 180 180 180 特殊变量 $0 $1 $2 ..的实践 结果: test.sh jiangbo 180 ###################### 特殊变量$# 获取参数总个数 结果: 4 ###################### 特殊变量$@ 实践 结果: jiangbo 180 180 180
11.2、$* 和 $@的区别你了解吗?
$*和$@ 都表示传递给函数或脚本的所有参数。 当$*和$#不被双引号“ ”引起来时,他们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。 但是当他们被双引号“ ”包含时,就会有区别了: “$*”会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。 “$@”仍然将每个参数都看做一份数据,彼此之间是独立的。
示例:
[root@localhost ~]# cat different.sh #! /bin/bash echo "print echo param from \"\$*\"" for var in "$*" doecho "$var" doneecho "########################" echo "print each param from \"\$@\"" for var in "$@" doecho "$var" done [root@localhost ~]# sh different.sh jiangbo 180 180 180 print echo param from "$*" jiangbo 180 180 180 ######################## print each param from "$@" jiangbo 180 180 180
备注:\"\$*\"中的反斜杠表示转义符号,for表示循环,do...done表示循环体。
相关文章:

Shell脚本学习笔记(更新中...)
一、什么是shell shell的作用是: 解释执行用户输入的命令程序等。 用户输入一条命令,shell就解释一条。 键盘输入命令,LInux给与响应的方式,称之为交互式。 shell是一块包裹着系统核心的壳,处于操作系统的最外层&a…...
leetcode 210.课程表II
思路:拓补排序 其实就是对于第一个题的问题变了一个问法,上一个题本质上是求有没有环,这道题本质上就是让你求出来符合没有环的路径输出而已,本质上没有什么区别。 不同就在于这里需要你额外开一个数组用来存储你遍历这个有向图…...
SpringBootTest测试框架五
示例 package com.xxx;import com.xxx.ut.AbstractBasicTest; import com.xxx.ut.uttool.TestModel; import...

赛事|基于SprinBoot+vue的CSGO赛事管理系统(源码+数据库+文档)
CSGO赛事管理系统 目录 基于SprinBootvue的CSGO赛事管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3参赛战队功能模块 4合作方功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…...
线性化技巧:绝对值变量的线性化
文章目录 1. 问题2. 线性化3. 缺少 x i x i − 0 x_i^ \times x_i^- 0 xixi−0 有什么问题4. 延伸思考5. 参考文献 1. 问题 以方述诚老师课件中的案例为例: m a x 3 x 1 − 2 x 2 − 4 ∣ x 3 ∣ s . t . − x 1 2 x 2 ≤ − 5 3 x 2 − x 3 ≥ 6 2 x 1 …...

List基本使用(C++)
目录 1.list的介绍 2.list的使用 list的构造 list的size() 和 max_size() list遍历操作 list元素修改操作 assign()函数 push_front(),push_back 头插,尾插 pop_front() pop_back 头删尾删 insert()函数 swap()函数 resize()函数 clear()函数 list类数…...

ELK 日志监控平台(一)- 快速搭建
文章目录 ELK 日志监控平台(一)- 快速搭建1.ELK 简介2.Elasticsearch安装部署3.Logstash安装部署4.Kibana安装部署5.日志收集DEMO5.1.创建SpringBoot应用依赖导入日志配置文件 logback.xml启动类目录结构启动项目 5.2.创建Logstash配置文件5.3.重新启动L…...

工作中写单片机代码,与学校里有什么不同?
来聊聊我的经历,提供几个提升方向,亲测有效,希望能让你少走几年弯路。 10几年前,还没参加工作的时候,主要是玩玩开发板,也接触不到实际产品的代码,很好奇那些产品级的代码是怎样的。 第一份工作…...

Unity LayerMask避坑笔记
今天使用Physics2D.OverlapAreaNonAlloc进行物理检测时候,通过LayerMask.NameToLayer传入了int值的LayerMask,结果一直识别不到,经过Debug才找到问题,竟是LayerMask的“值”传输有问题,记录一下。 直接贴代码输出结果&…...

(原创)从右到左排列RecycleView的数据
问题的提出 当我们写一个Recycleview时,默认的效果大概是这样的: 当然,我们也可以用表格布局管理器GridLayoutManager做成这样: 可以看到,默认的绘制方向是: 从左到右,从上到下 那么问题来了…...

【C语言】数据指针地址的取值、赋值、自增操作避坑
【C语言】数据指针的取值、赋值、自增操作避坑 文章目录 指针地址指针自增指针取值、赋值附录:压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转换什么是大端和小端数据传输中的大小端总结大小端转换函数 指针地址 请看下列代码&#…...

Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作
在Java编程中,BeanUtil工具类是一种强大且便捷的工具,用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能,通过详细的代码示例展示其应用,并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用…...

【ES6】ECMAS6新特性概览(一):变量声明let与const、箭头函数、模板字面量全面解析
🔥 个人主页:空白诗 🔥 热门专栏:【JavaScript】 文章目录 🌿 引言一、 let 和 const - 变量声明的新方式 🌟📌 var的问题回顾📌 let的革新📌 const的不变之美 二、 Arro…...

刷题之从前序遍历与中序遍历序列构造二叉树(leetcode)
从前序遍历与中序遍历序列构造二叉树 前序遍历:中左右 中序遍历:左中右 前序遍历的第一个数必定为根节点,再到中序遍历中找到该数,数的左边是左子树,右边是右子树,进行递归即可。 #include<vector>…...

微信小程序--微信开发者工具使用小技巧(3)
一、微信开发者工具使用小技巧 1、快速创建小程序页面 在app.json中的pages配置项,把需要创建的页面填写上去 2、快捷键使用 进入方式 1: 文件–>首选项–> keyboard shortcuts 进入快捷键查看与设置 进入方式 2: 设置–>快捷键…...
JDBC的 PreparedStatement 的用法和解释
文章目录 前言1、封装数据库连接和关闭操作数据库配置文件 config.properties 2、批量添加操作3、查询操作4、修改和删除操作总结 前言 PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 1、封装数据库连接和关闭操作 package org.springblade.m…...
LeetCode 面试150
最近准备面试,我以前不愿意面对的 现在保持一颗本心,就是专注于算法思想,语言基础的磨炼; 不为速成,不急功近利的想要比赛,或者为了面试。 单纯的本心,体验算法带来的快乐,是一件非常…...
xmake+xrepo自建仓库添加交叉编译工具链
xmakexrepo自建仓库添加交叉编译工具链 最近想将交叉编译工具链放到xrepo自建仓库中,在xmake中引用,方便多个电脑快速实现交叉编译。 xmake官方文档感觉不够详细,折腾了好久,这里做个记录。 基本步骤如下: 添加自建…...

论文阅读》学习了解自己:一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023
《论文阅读》学习了解自己:一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023 前言 简介研究现状任务定义模型架构Learning to know myselfLearning to avoid Misidentification损失函数实验结果消融实验 前言 亲身阅读感受分享,细节画图解释…...

[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...