一文快速学会linux shell 编程基础!!!

news2024/11/17 11:32:16

文章目录

  • 前言
  • 一、shell脚本执行的方式
    • 1.格式要求
    • 2.脚本常用执行方式
      • 2.1 . 输入脚本的绝对路径或相对路径进行执行
      • 2.2 使用 sh + 脚本的方式
      • shell 的注释语法
  • 二、shell 变量
    • 1.shell变量介绍
    • 2.shell 变量的定义
      • 定义变量
      • 定义变量的规则
      • 将命令的返回值赋给变量
    • 3.设置环境变量
    • 3.位置参数变量
      • 基本语法
    • 4.预定义变量
  • 三、运算符
  • 四、条件判断
  • 五、流程控制
    • 1.if判断语句
    • 2.case判断语句
    • 3.for循环语句
    • 4.while循环语句
  • 六、read读取控制台输入
  • 七、函数
    • 系统函数
    • 自定义函数


前言

shell脚本编程是linux中重要的一个环节,熟悉shell脚本编程,我们可以更好的在linux环境下工作。


一、shell脚本执行的方式

1.格式要求

脚本要以#!/bin/bash 开头

2.脚本常用执行方式

2.1 . 输入脚本的绝对路径或相对路径进行执行

这个没什么好说的,只说一点,这种执行方式需要有执行权限。

2.2 使用 sh + 脚本的方式

bash 脚本的路径
这种方式不需要有执行权限就可以执行

shell 的注释语法

# 是shell的单行注释
:<<! xxxx !是shell的多行注释,我建议多行注释的符号各占一行,例如下面这样

:<<!
xxxx
xxxxx
!

二、shell 变量

1.shell变量介绍

代码如下(示例):

linux shell中的变量分为,系统变量和用户自定义变量
系统变量:$HOME,$PWD,$SHELL,$USER等等
显示当前shell中所有的变量:set

2.shell 变量的定义

定义变量

1.定义变量:变量名=值
2.撤销变量:unset 变量
3.声明静态变量:readonly 变量名=值
注意,静态变量不能使用unset

下面的代码会在最后一行报错

#!/bin/bash
# 定义变量A
A=100
# 输出变量需要加上$
echo A=$A
echo "A=$A"
# 撤销变量A
unset A
echo "A=$A"
# 声明静态的变量B=2,不能unset
readonly B=2
echo "B=$B"
unset B

定义变量的规则

变量名称可以由字母、数字和下划线组成,但是不能以数字开头
5A=100就是错的
等号两侧不能有空格
变量名称一般习惯为大写,这个是一个规范,遵守即可

将命令的返回值赋给变量

A=`date` 反引号,运行里面的命令,并把结果返回给变量A
A=$(date) 等价于 A=`date`

3.设置环境变量

(关于这个,如果你之前在linux环境下配置过java的环境变量,这个可以不用看,步骤是一模一样的)
基本流程

  1. export 变量名=变量值(一般都是在/etc/profile里面写环境变量)
  2. source 配置文件
  3. echo $变量名

3.位置参数变量

位置参数变量,用大白话来说,就是当你用命令行执行这个shell脚本文件的时候,来获取这行命令里面的一些东西

基本语法

  • $n(n为数字,$0代表命令本身,$1~$9代表第一到第九个参数,如果要获取第十个以上的参数,需要这样写 ${10} )
  • $*(这个变量代表命令行中的所有参数,但是把所有的参数看成一个整体)
  • $@ (这个变量也是代表命令行中的所有参数,但是$@把每个参数区分对待)
  • $# (这个变量代表命令行中的所有参数的个数)

下面有一个shell脚本可以供大家理解

#!/etc/bash

echo "0=$0 1=$1 2=$2"

for i in "$*";do
 echo $i
done

for i in "$@";do
echo $i
done

echo "number=$#"
~                   

在这里插入图片描述
$ @ 与 $ * 如果不在双引号里面的效果是一样的,但是如果在双引号里面
$ * 就会把所有的参数当作一个东西来看,这在上面的代码里面已经看的很清楚了,
$ @ 则是分开的

4.预定义变量

大白话就是shell设计者已经定义好的变量,可以直接使用

  • $$ (获得当前进程的进程号(PID))
  • $! (后台运行的最后一个进程的进程号(PID))
  • $?(最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确了)
#!/bin/bash
echo "当前执行的进程id=$$"
# 以后台的方式运行一个脚本,并获得他的进程号
. position.sh 100 200 &
echo "最后一个后台方式运行的进程id=$!"
echo "执行结果是=$?"

在这里插入图片描述

三、运算符

基本语法

  • $((运算式)) 或 $[运算式] 或 expr m + n (expr代表 expression ,expr的写法中运算符之间要有空格)
  • 乘号 \*(对,就是这么奇怪,有反斜杠)
  • 除号 /
  • 取余 %
  • 如果希望将expr的运算结果赋给某个变量,可以使用我们之前学习的反引号(就是1左边的那个)``
#!/bin/bash
#案例1:计算(2+3)*4的值
#使用第一种方式
RES1=$(((2+3)*4))
echo "res1=$RES1"
#使用第二种方式
RES2=$[(2+3)*4]
echo "res2=$RES2"
#使用第三种方式
TMP=`expr 2 + 3`
RES4=`expr $TMP \* 4`
echo "temp=$TMP"
echo "res4=$RES4"
                     

在这里插入图片描述

四、条件判断

判断语句
基本语法

  • [ condition ] (注意!!!condition前后要有空格),非空返回true,可使用$?验证
    常用判断条件
  1. 字符串比较 =
    两个整数的比较
  • -lt 小于

  • -le 小于等于

  • -eq 等于

  • -gt 大于等于

  • -ne不等于
    按照文件权限进行判断

  • -r 有读的权限

  • -w 有写的权限

  • -x 有执行的权限
    按照文件类型进行判断

  • -f文件存在并且是一个常规的文件

  • -e 文件存在

  • -d 文件存在并且是一个目录


照例来个代码

#!/bin/bash
#案例1:"ok"是否等于ok

# 判断语句,使用 =
if [ "ok" = "ok" ]
then
        echo "equal"
fi

# 案例2:23是否大于等于22
#判断语句:使用-ge
if [ 23 -ge 22 ]
then
        echo "大于"
fi

# 案例3:/shellcode/aaa.txt 目录中的文件是否存在
# 判断语句:使用 -f
if [ -f /shellcode/aaa.txt ]
then
        echo "存在"
fi

在这里插入图片描述

五、流程控制

1.if判断语句

(这个我不再多说了,相信学linux的各位至少学过一门编程语言)
基本语法
单分支

if [ 条件判断式 ]
then
代码
fi

或者 多分支

if [ 条件判断式 ]
then
代码
elif [条件判断式]
代码
elif [条件判断式]
代码
…(这里指可以写多个elif)
else(else可省略)
代码
fi

2.case判断语句

(这个跟java 里面的 switch case 类似,但是看起来非常的诡异)
基本语法

case $变量名 in
“值1”)(注:如果变量的值等于值1,则执行程序1)
代码
;;
“值2”)(注:如果变量的值等于值2,则执行程序2)
代码
;;
*)(注:如果变量的值都不是以上的值,则执行下面的代码)
代码
;;
esac

#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac

在这里插入图片描述

3.for循环语句

基本语法

for 变量 in 值1 值2 值3
do
程序
done

或者

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

#!/bin/bash
for i in "$*"
do
 echo $i
done

for i in "$@"
do
echo $i
done
#!/bin/bash
SUM=0
for ((i=0;i<=$1;i++))
do
SUM=$[$SUM+$i]
done
echo $SUM

在这里插入图片描述

4.while循环语句

while [条件判断式]
do
程序
done

#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done
echo "执行结果=$SUM"

在这里插入图片描述

六、read读取控制台输入

基本语法

read (选项) (参数)
选项:
-p :指定读取值时的提示符;
-t ; 指定读取值时的等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。。
参数:
变量:指定读取值的变量名
注意!!! read 与 $n 不同,read的读取输入是必须要输入的,如果你不输入,脚本> 会一直在那个地方堵塞

#!/bin/bash
#读取控制台输入一个NUM1值
read -p "请输入一个数NUM1=" NUM1#这里要注意 NUM1 跟前面的双引号要有空格,下面的NUM2也是如此
echo "你输入的NUM1=$NUM1"
# 读取控制台输入一个NUM1值,在10秒内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"

在这里插入图片描述

七、函数

  • 函数介绍
    shell编程和其他编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。

系统函数

basename基本语法
功能:返回完整路径最后 / 的部分,常用用于获取文件名

basename [pathname] [suffix]
(功能描述:basement命令会删除所有的前缀包括最后一个(“/”)字符,然后将字符串显示出来)
suffix 为后缀,如果suffix 被指定了,basename 会将pathname 或 string 中的 suffix 去掉

在这里插入图片描述

dirname 基本语法
功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
语法
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名)

在这里插入图片描述

自定义函数

基本语法

[ function ] funname[()]
{
Action;
[return int;]
}

调用直接写函数名:funname [值]

#!/bin/bash
function getSum() {

        read -p "请输入一个数n1=" n1
        read -p "请输入一个数n2=" n2
        SUM=$[$n1+$n2]
        echo "和是=$SUM"
}

getSum

在这里插入图片描述

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

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

相关文章

多功能电力仪表在物联网的应用

安科瑞 华楠 有线多功能电力仪表场景 应用场景 功能&#xff1a; 1.支持全电力参数测量&#xff1b;以及2-31次分次谐波测量&#xff1b;支持双向有功电能计量&#xff0c;支持四套时段表、4个时区、14个日时段、4种费率的电能统计&#xff1b;需量及发生时间统计&#xff1…

智慧党务管理源码,竞赛答题+阅读学习一套系统全搞定

智慧党务源码系统是利用互联网技术实现党建信息资源整合、逐步提升现代化党建知识水平的党务学习答题系统平台。今天万岳科技就来讲一讲如果开发一套智慧党务源码需要满足哪些功能&#xff1f;智慧党务学习答题系统主要功能为&#xff1a; 1、党组织管理&#xff1a;对各级党务…

我参加NVIDIA Sky Hackathon 环境安装(基本系统环境)

我的硬件环境 x86的物理机RTX 3060 12G16G 的 U盘 软件环境 Ubuntu 20.04 LTSssh 命令行输入 apt install ssh 即可 第一个坑&#xff1a; 18.04 的 Ubuntu 系统在安装过程中无法显示&#xff0c; 99% 的场景显示器会黑屏所以 3060 最好使用 Ubuntu 20.04 及以上版本 安装…

SpringMVC ---- SpringMVC的视图

SpringMVC ---- SpringMVC的视图1. ThymeleafView2. 转发视图3. 重定向视图4. 视图控制器view-controllerSpringMVC 中的视图是 View 接口&#xff0c;视图的作用是渲染数据&#xff0c;将模型 Model 中的数据展示给用户 SpringMVC 的视图种类很多&#xff0c;默认有转发视图和…

[附源码]SSM计算机毕业设计“云味坊”购物网站JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

振弦采集模块的通讯协议( IIC)

振弦采集模块的通讯协议&#xff08; IIC&#xff09; IIC 通讯协议本身即是基于设备地址和寄存器的物理层通讯协议&#xff0c; VMXXX 使用 IIC 接口对传感器的访问&#xff0c;请遵循前述硬件接口时序及协议说明即可。 IIC 访问时使用与 UART 相同的寄存器地址&#xff0c;地…

【云原生-Docker】使用 Docker Compose 管理容器

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;Docker学习专栏 ✨学习社区&#xff1a;&#x1f449;不会压弯的小飞侠 ✨知足上进&#xff0c;不负…

5种方法实现(a==1 a==2 a==3) == true

乍一看&#xff0c;这个咋能相等呢&#xff1f;深入思考就发现不仅可以相等&#xff0c;还有不少方法&#xff0c;下面就来讲讲这些方法都是如何实现的。 一、valueOf && toString 直接上代码&#xff1a; 比较运算分为2种&#xff0c; 一种为严格比较()&#xff0c;…

【设计模式】类图

本文主要介绍类图的概念、类之间的关系以及如何用类图表示类和类之间的关系 类图&#xff1a; 是一种静态结构图&#xff0c;是系统分析和设计阶段的重要产物。 类图画法&#xff1a; 1. 类的表示方式 类的表示中包含类名、属性 和 方法&#xff0c; 其中&#xff0c; 表示…

C++ Reference: Standard C++ Library reference: Containers: deque: deque: empty

C官网参考链接&#xff1a;https://cplusplus.com/reference/deque/deque/empty/ 公有成员函数 <deque> std::deque::empty C98 bool empty() const; C11 bool empty() const noexcept;测试容器是否为空 返回deque容器是否为空&#xff08;即其size是否为0&#xff09;…

大一Web课程设计:企业网站——HTML+CSS+JavaScript电子购物商城(37页面)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

VIAVI唯亚威FI-10/-11 光纤识别仪

FI-10 和 FI-11 手持式光纤识别仪稳固可靠&#xff0c;易于安装和维护&#xff0c;能够检测通过单模光纤传输的光信号&#xff0c;从而识别出光纤。它们采用局部检测技术&#xff08;非破坏性宏弯检测&#xff09;&#xff0c;从而不再需要在接合点处打开光纤进行识别&#xff…

【好文鉴赏】优秀的后端应该有哪些开发习惯

关键词&#xff1a;[后端] [编程习惯] [代码风格] 原文链接&#xff1a; https://juejin.cn/post/7072252275002966030https://www.51cto.com/article/721104.html 这里涉及到的主要是 Java 语言&#xff0c;当然也有通用的一些习惯&#xff1b; 拆分合理的目录结构 受传统的…

Spring Cloud网关路由谓词

目录 一、前言 1、注意事项 2、词汇表 3、工作原理 二、配置路由谓词工厂 1、快捷方式 1.1、快捷方式配置 1.2、完全展开的参数 2、路由谓词工厂 2.1、路由谓词工厂之后 2.2、路线谓词工厂之前 2.3、路由谓词工厂之间 3、Cookie路线谓词工厂 4、标头路由谓词工厂 …

Rust机器学习之Polars

Rust机器学习之Polars 本文将带领大家学习Polars的基础用法&#xff0c;通过数据加载→\rarr→数据探索→\rarr→数据清洗→\rarr→数据操作一整个完整数据处理闭环&#xff0c;让大家学会如何用Polars代替Pandas进行数据处理。 本文是“Rust替代Python进行机器学习”系列文…

Golang入门笔记(5)—— 流程控制之switch分支

switch 有切换&#xff0c;开关的意思&#xff0c;我想这也许就是代码上的意义&#xff0c;通过表达式计算出一个值&#xff0c;然后进行状态的匹配和然后进行流程上的切换。 基本语法&#xff1a; switch 表达式 {case 值a1,值a2, ...语句块case 值b1&#xff0c;值b2, ...语…

[附源码]计算机毕业设计JAVA高校资源共享平台

[附源码]计算机毕业设计JAVA高校资源共享平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

IOT云平台 simple(4)springboot netty实现简单的mqtt broker

常见的开源mqttBroker很多&#xff0c;如&#xff1a; Mosquitto、emqx&#xff1b; 这里简单的介绍了mqtt&#xff0c;然后利用springboot netty实现了简单的mqtt Broker。 mqtt Broker&#xff1a;springboot netty实现&#xff1b; mqtt client&#xff1a;MQTT.fx工具软件…

Java Tomcat内存马——filter内存马

目录 前言&#xff1a; &#xff08;一) 内存马简介 0X01 原理 0X02 内存马类型 2.1 servlet-api类 2.2 spring类 2.3 Java Instrumentation类 &#xff08;二&#xff09; filter 内存马 &#xff08;三&#xff09;Tomcat Filter 流程分析 0x01 项目搭建 0x02 在访…

【Spring】——5、@Lazy懒加载

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…