Linux Shell 脚本编程基础知识篇

ℹ️大家好,我是练小杰,从本文是Linux shell脚本编程的基础知识内容,后续我会不断补充~~
更多Linux 相关内容请点击👉“Linux专栏”~

假面驾驭,时王,假面骑士时王~~
在这里插入图片描述

文章目录

  • 什么是 Linux Shell
    • 主要功能
    • 常见SHELL类型
    • Shell 的优势
  • 文件编译器
    • Vim
    • Nano
    • Emacs
    • Gedit
    • Kate
    • Sublime Text
    • Atom
    • Micro
    • Helix
    • Midnight Commander (mcedit)
  • 运行Shell脚本命令
    • 脚本需要有可执行权限,若没有X权限时,有以下两种办法
    • 编写Shell脚本并运行(新手)
    • 温馨提醒
  • Shell变量
    • shell变量类型
    • 自定义变量
      • 举个例子:
    • 环境变量
      • 相关配置文件
    • 位置变量
      • 实例:
    • 预定义变量
  • 变量的数值计算
      • 举例:
    • 逻辑运算符
    • **算数运算符**
    • 双小括号 `(( ))`
      • 实例:
    • Shell 中的 ‘ | ’ 符号

在这里插入图片描述

什么是 Linux Shell

Shell本身是一个用C语言编写的程序, 它是用户使用Linux的桥梁。Shell既是一种命令语言, 又是一种程序设计语言。
所有的Linux命令都是Shell脚本语言。
其中shell文件命名以.sh为后缀,例如:lxj.sh

⚠️Linux中的三大查询命令都能结合起来用,也就是awk、sed、grep 都能用管道“ | ”结合用

主要功能

  • 命令的解释:
    读取用户输入的命令,解释并执行这些命令
  • 脚本编写:
    允许用户编写脚本(批处理文件),自动化执行一系列命令。
  • 环境配置:
    管理用户的环境变量,如 PATH、HOME 等。
  • 输入输出重定向:
    将命令的输入和输出重定向到文件或其他设备。
  • 管道“|”:
    将一个命令的输出作为另一个命令的输入,实现命令的组合使用
  • 作业控制:
    管理后台和前台作业,允许用户暂停、恢复和终止作业。

常见SHELL类型

  • Bash (Bourne Again Shell):
    最常用的 Shell,广泛应用于大多数 Linux 发行版本。
  • Sh (Bourne Shell):
    由 Stephen Bourne 开发的原始 Shell,广泛用于 Unix 系统。
  • Csh (C Shell):
    语法类似于 C 语言,适合习惯于 C 语言的程序员。
  • Tcsh (TENEX C Shell):
    Csh 的增强版本,提供了命令行编辑和拼写检查等功能。
  • Ksh (Korn Shell):
    由 David Korn 开发,兼容于 Bourne Shell,并增加了许多新特性。
  • Zsh (Z Shell):
    现代的、功能丰富的 Shell,结合了 Bash、KshTcsh 的特性

Shell 的优势

  1. Shell 提供了与操作系统交互的便捷方式,适合日常的系统管理任务
  2. 通过编写 Shell 脚本,用户可以自动化执行重复性任务,提高效率
  3. 同时,Shell 也提供了变量、循环、条件判断等命令,使得脚本编写更加灵活

文件编译器

Linux Shell 中,有多种文本编辑器可供选择,涵盖了从命令行到图形界面的各种工具

Vim

  • 支持语法高亮、插件扩展、宏录制等功能,适合高级用户使用
  • 安装命令:sudo apt install vim
  • 使用vim编辑脚本

打开文件: vim 文件名
进入插入模式:按 i
退出插入模式:键盘按 Esc
保存并退出:输入 :wq 并按 Enter退出编辑

Nano

  • 基本的文本编辑功能,并且界面底部显示了常用的快捷键

  • 安装命令:sudo apt install nano

  • 使用nano编辑脚本

打开文件:nano 文件名
保存文件:按 Ctrl + O
退出编辑器:按 Ctrl + X

Emacs

  • 具有丰富的插件和自定义选项,适合需要高度定制化环境的用户
  • 安装命令:sudo apt install emacs
  • 使用方式:

打开文件:emacs 文件名
保存文件:按 Ctrl + X 然后按 Ctrl + S
退出编辑器:按 Ctrl + X 然后按 Ctrl + C

Gedit

  • GNOME 桌面环境的默认文本编辑器,提供图形用户界面,适合需要图形界面的用户
  • 安装命令: sudo apt install gedit
  • 使用方式:

打开文件:gedit 文件名
保存文件:点击“保存”按钮
退出编辑器:点击“关闭”按钮

Kate

  • KDE 桌面环境的文本编辑器,支持多文档编辑、语法高亮等功能,适合需要高级编辑功能的用户。
  • 安装命令:sudo apt install kate
  • 使用方式:

打开文件:kate 文件名
保存文件:点击“保存”按钮
退出编辑器:点击“关闭”按钮

Sublime Text

  • 跨平台文本编辑器,具有快速启动、强大的搜索和替换功能,适合需要高效编辑环境的用户。
  • 安装命令:sudo snap install sublime-text --classic
  • 使用方式:

打开文件:sublime-text 文件名
保存文件:按 Ctrl + S
退出编辑器:点击“关闭”按钮

Atom

  • 由 GitHub 开发的免费开源文本编辑器,支持多种编程语言和插件扩展

  • 具有高度可定制性,适合需要自定义编辑环境的用户。

  • 安装命令:sudo snap install atom --classic

  • 使用方式:

打开文件:atom 文件名
保存文件:按 Ctrl + S
退出编辑器:点击“关闭”按钮

Micro

  • 易于使用且高度可定制的文本编辑器,支持通用复制/粘贴/保存快捷键。
  • 安装命令:sudo apt install micro
  • 使用方式:

打开文件:micro 文件名
保存文件:按 Ctrl + S
退出编辑器:按 Ctrl + Q

Helix

  • 基于 Rust 的终端文本编辑器,快速且高效,使用 Tree-Sitter 进行语法高亮,适合需要现代编辑功能的用户。
  • 安装命令:
git clone https://github.com/helix-editor/helix
cd helix
cargo install --path helix-term
  • 使用方式:

打开文件:helix 文件名
保存文件:按 Ctrl + S
退出编辑器:按 Ctrl + Q

Midnight Commander (mcedit)

  • 一个命令行文件管理器,其内部文件编辑器 mcedit 也是一个功能强大的文本编辑器,适合需要文件管理和编辑功能的用户。
  • 安装命令:sudo apt install mc
  • 使用方式:

打开文件:mcedit 文件名
保存文件:按 F2
退出编辑器:按 F10

运行Shell脚本命令

  • 一般形式:
./filename.sh   或者  source filename.sh
#使用“ ./ ”  执行脚本需要增加X执行权限。

⚠️ 一般运行脚本之前都需要先给.sh脚本增加可执行(x)权限。

  • 输入重定向到Shell脚本
    Shell从指定文件中读入命令行,并进行相应处理
  bash < filename.sh 

脚本需要有可执行权限,若没有X权限时,有以下两种办法

  • 给文件增加可执行权限
chmod  744  filename.sh 或者 chmod  a+x filename.sh
  • 强制执行脚本文件,则不需要在脚本文件开头加Bash 解释器 #!/bin/bash 或者 Shell解释器#!/bin/sh
sh [选项] filename.sh   或者  bash [选项] filename.sh

-v选项:允许用户查看Shell程序的读入和执行,会打印出命令行的原始内容
x选项: 允许用户查看Shell程序的执行,会打印出经过替换后的命令行的内容

编写Shell脚本并运行(新手)

  • 利用vim编辑器
vim lxj.sh 
  • 编辑lxj.sh文件,保存并退出
#!/bin/bash 
echo "Wellcome to lxj"
  • 增加可执行权限并运行
chmod 744 lxj.sh
./lxj.sh

运行结果:

Wellcome to lxj

温馨提醒

  • source filenamesh filename./filename执行脚本的区别
  1. 当shell脚本具有可执行权限(X)时,用sh filename./filename执行脚本是没有区别的。./filename是因为当前目录没有在PATH中,所有“.”是用来表示当前目录的。

  2. sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell。

  3. source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里。

Shell变量

shell变量类型

四类: 自定义变量、环境变量,位置变量和预定义变量

自定义变量

  • 定义:变量名=变量值 ,变量名必须以字母或下画线开头,区分大小写,如a=192.168.16.11 (储存数据)

  • 使用变量:

$变量名 (一个值)
  • 查看变量:
echo $变量名 
#查看某个变量echo $变量名  set  
#所有变量: 包含自定义变量和环境变量
  • 取消变量:
unset  变量名 
  • 作用范围:仅对当前Shell脚本有效

举个例子:

#!/bin/bash
a=lxj  #等号左右不能有空格  
echo "I am $a"   

结果:

I am lxj

环境变量

  • 定义:
    export 命令声明 ,比如:
export HISTSIZE=100  
#暂时修改为查看最近100条的操作痕迹
  • 用法:
$变量名  或 ${变量名}
  • 查看环境变量:

查看某个环境变量,例如

echo $PATH

查看当前环境的所有环境变量

env   
  • 作用范围:对当前Shell 和子shell 都有效果

相关配置文件

全局文件: /etc/profile (所有用户都有效)

用户文件: /.bash_profile (对指定用户有效, 进入目录 /home 找到你的用户目录才能用)

永久性改变环境变量置目录:/etc/bashrc

⚠️修改变量后不会立刻生效,必须要刷新文件

source  /etc/profile #文件路径,立刻生效

位置变量

  • 作用:在命令行、函数或者脚本中传递参数,变量不用定义。

  • 命令详解:

$0 获取当前的Shell脚本的文件名
$1-$9 接收的第1~9个参数
${10} 从第10个参数开始,必须用大括号括起来

实例:

-运用vim编辑器

vim lxj.sh
  • 编写脚本
#!/bin/bash 
echo  $1 
echo  $2 
  • 运行脚本
 ./lxj.sh 1 2 

结果:

1
2

预定义变量

  • 命令定义解释:

$0 脚本名
$* 显示所有参数
$@ 显示所有参数
$# 当前参数的个数
$$ 当前进程PID号
$! 上一个后台进程的PID号
$? 上一个命令的返回值,返回0表示成功、返回非0数表示运行错误

变量的数值计算

  • 数值计算的优先级:
()>>算术运算符 > 关系运算符> 逻辑运算符>赋值运算符

举例:

#!/bin/bash
a=10
b=5# 加法
sum=$((a + b))
echo "a + b = $sum"# 减法
diff=$((a - b))
echo "a - b = $diff"# 乘法
prod=$((a * b))
echo "a * b = $prod"# 除法
quot=$((a / b))
echo "a / b = $quot"# 取模
mod=$((a % b))
echo "a % b = $mod"# 幂运算
power=$((a ** b))
echo "a ** b = $power"

结果:

a + b = 15
a - b = 5
a * b = 50
a / b = 2
a % b = 0
a ** b = 100000

逻辑运算符

-f 判断文件是否存在 例如: if [ -f filename ]
-d 判断目录是否存在 例如: if [ -d dir ]
-a 与运算(and) 例如: 逻辑表达式 –a 逻辑表达式
-o 或运算(or) 例如: 逻辑表达式 –o 逻辑表达式
-z 空字符串

算数运算符

-eq #等于 应用于:整型比较 equal

-ne #不等于 应用于:整型比较 not equal

-gt #大于 应用于:整型比较 greate

-lt # 小于 应用于:整型比较 letter

-ge #大于或等于 应用于:整型比较 greate equal

-le #小于或等于 应用于:整型比较 letter equal

双小括号 (( ))

  • 作用:进行数值运算与数值进行比较

  • 语法要求:

((i=i+1)) 称为运算后赋值法,把 i+1的运算后结果赋值给变量i

#!/bin/bash 
i=1
echo $((i=i+1)) #输出结果为2
  • i=$((i+1))(( ))前加$符,表示将表达式运算后赋值给i
#!/bin/bash 
i=1
echo i=$((i+1)) #输出结果i=2
  • 加入逻辑运算((8>7&&5==5))
#!/bin/bash 
echo $((8>7 && 5==5))  #输出结果为1

⚠️注意:上面涉及的数字及变量必须为整数(整型),不能是小数(浮点数)或字符串。

实例:

[root@master home]# a=5
[root@master home]# b=10
[root@master home]# echo $((a>(b-1)&&2-b))  
0
[root@master home]# echo $(($a>($b-1)&&2-$b))
0

Shell 中的 ‘ | ’ 符号

利用管道二次筛选数据:

awk "{print }"  /etc/passwd 
#输出该目录文件的内容awk "{print }"  /etc/passwd | grep lian
#上面内容基础下进行筛选有字符串lian的部分

想要了解更多内容点击👉“练小杰的CSDN”!!!
今天星期三,明天星期四,再坚持3天就是冬至了!!!
明天见,各位大佬!!😄

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

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

相关文章

QT绘制同心扇形

void ChartForm::paintEvent(QPaintEvent *) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 设置抗锯齿painter.save();// 设置无边框&#xff08;不需要设置QPen&#xff0c;因为默认是不绘制边框的&#xff09;QPen pen(Qt::NoPen);// QPen pen…

TL3568/TL3562更改主机名,在Kernel用menuconfig失效

前言 最近在玩RK3562开发板&#xff0c;想改串口调试时看到的主机名&#xff0c;开发板的主机名默认是RK3562-Tronlong&#xff0c;如图&#xff1a; 按照之前玩T113开发版&#xff0c;在Kernel通过make menuconfig&#xff0c;可以改。但是在这个RK3562&#xff0c;改了后&…

【PLL】ISSCC 2024 Tutorial: Calibration Techniques in PLLs

1. 数字辅助模拟电路 为什么要辅助&#xff0c;或替换模拟电路&#xff1f; 利用CMOS管子尺寸缩小&#xff0c;降低功耗 和 减小面积校正模拟电路的 非线性行为 和 失配 数字辅助的好处&#xff1a; 简化模拟电路设计提高能源效率&#xff0c;提高准确度 2. 锁相环基础 2.1 概…

STM32-笔记5-按键点灯(中断方法)

1、复制03-流水灯项目&#xff0c;重命名06-按键点灯&#xff08;中断法&#xff09; 在\Drivers\BSP目录下创建一个文件夹exti&#xff0c;在该文件夹下&#xff0c;创建两个文件exti.c和exti.h文件&#xff0c;并且把这两个文件加载到项目中&#xff0c;打开项目工程文件 加载…

Mvc、Springmvc框架

一.Mvc&#xff1a; 1.概念&#xff1a; MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 、View视图 、Controller控制层&#xff1b; 结构图&#xff1a; 二.Springmvc: 1.概念&#xff1a; springmvc框架它是spring框架的一个分支。它是按照mvc架构思想设计…

spring使用rabbitmq当rabbitmq集群节点挂掉 spring rabbitmq怎么保证高可用,rabbitmq网络怎么重新连接

##spring rabbitmq代码示例 Controller代码 import com.alibaba.fastjson.JSONObject; import com.newland.mi.config.RabbitDMMQConfig; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageProperties; import org.springframewo…

前端面试问题集合

0 HTML5相关 websocket WebSocket 使用ws或wss协议&#xff0c;Websocket是一个持久化的协议&#xff0c;相对于HTTP这种非持久的协议来说。WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻&#xff0c;相互推送信息。WebSocket并不限于以Ajax(或X…

RabbitMQ如何构建集群?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ如何构建集群&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ如何构建集群&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在RabbitMQ中&#xff0c;集群&#xff08;Cluster&#x…

3大Excel免费功能

推荐几个免费excel图表绘制工具 Power Map Power Map是Excel的内置功能 Power Map可在Windows用户的Excel 2013或者Excel 2016或者Office 365中使用,如下图, 看案例 动态地图1 动态地图2

概率论得学习和整理31: 连续型随机变量的概率本质是求面积,均匀分布等

目录 1 连续性随机变量 2 连续性随机变量和 离散型随机变量&#xff0c;分布的区别 3 不要混淆概念 4 均匀分布的相关 4.1 定义 4.2 例子 1 连续性随机变量 连续性随机变量最大的特点&#xff0c;单个点上的概率0多了一个分布函数&#xff0c;因为从1维变2维了&#xff…

素数回文数的个数

素数回文数的个数 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 求11到n之间&#xff08;包括n&#xff09;&#xff0c;既是素数又是回文数的整数有多少个。 输入 一个大于11小于1000的整数n。 输出…

FFmpeg库之ffmpeg

文章目录 ffmpeg命令行使用基本命令选择流 -map选项 主要命令视频选项音频选项多媒体格式转换滤镜裁剪加水印画中画 录制查看可用的录制设备查看录制设备选项参数录制桌面录制窗口录制摄像头录制麦克风录制系统声音同时录制桌面和麦克风 直播推流拉流 ffmpeg命令行使用 ffmpeg…

牛客周赛 Round 72 题解

本次牛客最后一个线段树之前我也没碰到过&#xff0c;等后续复习到线段树再把那个题当例题发出来 小红的01串&#xff08;一&#xff09; 思路&#xff1a;正常模拟&#xff0c;从前往后遍历一遍去统计即可 #include<bits/stdc.h> using namespace std; #define int lo…

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…

SpringBoot整合druid数据源

SprintBoot默认使用的是HikariDataSource数据源&#xff0c;而且上次课中我们也说了这个数据源访问速度很快&#xff0c;但是这里还要给大家介绍一个第三方的数据源druid&#xff0c;它是阿里开发的一款开源的数据源&#xff0c;被很多人认为是Java语言中最好的数据库连接池&am…

Dubbo 3.x源码(26)—Dubbo服务引用源码(9)应用级服务发现订阅refreshServiceDiscoveryInvoker

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了MigrationRuleHandler这个处理器&#xff0c;它用于通过动态更改规则来控制迁移行为。MigrationRuleListener的onrefer方法是Dubbo2.x 接口级服务发现与Dubbo3.x应用级服务发现之间迁移的关键…

Qt Creator 为同一个项目切换不同的构建套件(Kit)

如下图所示&#xff0c;我只有一个构建套件&#xff1a; 切换构建套件(Kit)的步骤如下&#xff1a; 选中上图中的步骤②后&#xff0c;可以看到如下图所示的结果&#xff0c;构建套件就已经添加成功了&#xff1a; 此时&#xff0c;我们可以自由选择使用哪一个构建套件。 如…

vue3实现商城系统详情页(前端实现)

目录 写在前面 预览 实现 图片部分 详情部分 代码 源码地址 总结 写在前面 笔者不是上一个月毕业了么&#xff1f;找工作没找到&#xff0c;准备在家躺平两个月。正好整理一下当时的毕业设计&#xff0c;是一个商城系统。还是写篇文章记录下吧 预览 商品图片切换显示…

Java深拷贝和浅拷贝区别?

大家好&#xff0c;我是锋哥。今天分享关于【Java深拷贝和浅拷贝区别?】面试题。希望对大家有帮助&#xff1b; Java深拷贝和浅拷贝区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Java中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&am…

React 第十七节 useMemo用法详解

概述 useMemo 是React 中的一个HOOK&#xff0c;用于根据依赖在每次渲染时候缓存计算结果&#xff1b; 大白话就是&#xff0c;只有依赖项发生变化时候&#xff0c;才会重新渲染为新计算的值&#xff0c;否则就还是取原来的值&#xff0c;有点类似 vue 中的 computed 计算属性…