当前位置: 首页 > news >正文

Linux-3:Shell编程——基础语法(0-50%)

目录

前言

一、变量

1.定义变量

2.使用变量

3.修改变量

4.将命令的结果赋值给变量

5.只读变量

6.删除变量

二、传递参数

三、字符串

1.字符串举例

2.统计字符串长度

3.字符串拼接

4.截取字符串

总结


前言

  • Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
  • Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
  • Shell 既是一种命令语言,又是一种程序设计语言。

 

一、变量

1.定义变量

  • Shell 支持以下三种定义变量的方式
    • variable=value
    • variable='value'
    • variable="value"

注意!!!赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。

运行文件之前记得保存 ctrl + s 快捷保存

  • Shell 变量的命名规范和大部分编程语言都一样:
    • 变量名由数字、字母、下划线组成;
    • 必须以字母或者下划线开头;
    • 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。

举例:.sh文件的开头必须是 #!/bin/sh 或者 #!/bin/bash 这是为了告诉操作系统使用该解释器

#!/bin/sha="hello world"
b=helloworld
c='hello world'

 

2.使用变量

  • 使用一个定义过的变量,只要在变量名前面加美元符号$即可
  • 变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
  • 当变量与其他字符相连时,应使用花括号
#!/bin/sha="java"echo $a            # echo 打印 相当于python里的print
echo ${a}echo "Can you use ${a}web"

 

3.修改变量

  • 已定义的变量,可以被重新赋值
#!/bin/bash$b='java'  
b='java'   # 正确更改变量 直接 变量名=新值
echo "${b} is good"

 

  • 单引号和双引号的区别
#!/bin/bash# 单双引号的区别 单引号内任何符号都被识别为字符串 无法引用变量
# 引用变量时最好加个{}  提高代码可读性
echo "hhhh ${b}"
echo 'hhhh ${b}'
echo hhhh ${b}

输出: 单引号引起来的全部被识别为字符串输出

hhhh 
hhhh ${b}
hhhh

 

4.将命令的结果赋值给变量

  • vm里有不少命令都会输出结果 
  • 可以将结果赋值给变量进行使用
#!/bin/bash# 命令的使用
comm=$(ps)    # ps 查看当前存在的进程及其状态 通过$()将命令进行赋值
echo ${comm} 
echo "there is : $(pwd)"   # pwd 查看当前文件路径
echo "there is : `pwd`"    # 优先运行$()和``里的命令 将结果作为参数输出 

输出:

PID TTY TIME CMD 3450 pts/1 00:00:00 bash 4014 pts/1 00:00:00 sh 4015 pts/1 00:00:00 ps
there is : /root/shell_code
there is : /root/shell_code

 

5.只读变量

  • 使用 readonly 命令 将变量定义为只读变量
  • 只读变量不可修改或删除
#!/bin/bash# readonly 只读变量 不能修改 也不能被删除tt="abcd"
echo "${tt}...."readonly tt          # 将tt变成只读变量
tt="lsakdjflkj"    # 赋值不成功  行31: tt: 只读变量
echo "${tt}...."

输出:

abcd....  
demo2.sh:行40: tt: 只读变量   # 因为尝试修改只读变量 所以报错

 

6.删除变量

  • 使用 unset 命令删除变量
  • 变量被删除后不能再次使用
  • unset 命令不能删除只读变量
#!/bin/shtt="abcd"
readonly tt          # 将tt变成只读变量# unset  删除变量 
unset tt           # 删除tt变量   第 34 行:unset: tt: 无法反设定: 只读 variable
echo "${tt}.lsjdfl"b="python"
echo "${b} is good"
unset b 
echo "${b} is good"   # b变量被删除 但是引用不会报错 只是输出空

输出:尝试删除只读变量 tt 会报错 ;删除失败 tt 仍可以使用;普通变量 b 被删除后引用不会报错 只是输出空

demo2.sh: 第 47 行:unset: tt: 无法反设定: 只读 variable
abcd.lsjdfl
python is goodis good

 

二、传递参数

举例:

#!/bin/sh# Shell脚本 脚本传参echo "运行的文件名为:$0"    # 这个脚本本身是第0个参数
echo "传递的第1个参数为:$1 "
echo "传递的第2个参数为:$2 "
echo "传递的第3个参数为:$3 "
echo "传递的第4个参数为:$4 "
echo "传递的第5个参数为:$5 "
echo "传递的第6个参数为:$6 "
echo "传递的第7个参数为:$7 "
echo "传递的第8个参数为:$8 "
echo "传递的第9个参数为:$9 "
echo "传递的第10个参数为:${10} "
echo "传递的第11个参数为:${11} "# 假设在脚本运行时写了三个参数 1、2、3
echo "$*"       # 则 " * " 等价于 "1 2 3"(传递了一个参数)
echo "$@"       # 而 "@" 等价于 "1" "2" "3"(传递了三个参数)echo $#         # $# 统计传入参数的总数  脚本名称是第0个参数  

输出:

[root@tokyo001 shell_code]# sh demo3.sh 1 2 3 4 5 65 6 7 8 8 9
运行的文件名为:demo3.sh
传递的第1个参数为:1 
传递的第2个参数为:2 
传递的第3个参数为:3 
传递的第4个参数为:4 
传递的第5个参数为:5 
传递的第6个参数为:65 
传递的第7个参数为:6 
传递的第8个参数为:7 
传递的第9个参数为:8 
传递的第10个参数为:8 
传递的第11个参数为:9 
1 2 3 4 5 65 6 7 8 8 9
1 2 3 4 5 65 6 7 8 8 9
11

 

参数处理说明:一般只用 $# $@ $*

 

三、字符串

1.字符串举例

#!/bin/shn=74
str1=www.aaa.com${n}
str2="shell \"script\" ${n}"  # 这里的"被\转义
str3='shell "script" $n'      # 单引号之内只存在字符串echo $n
echo $str1
echo $str2
echo $str3

输出:可以看到单引号引起来的${n} 没有被引用变量,而是直接输出,说明单引号引起来的内容只会被认定成字符串输出。

74
www.aaa.com74
shell "script" 74
shell "script" $n

 

2.统计字符串长度

#!/bin/shn=74
str1=www.aaa.com${n}
str2="shell \"script\" ${n}"  # 这里的"被\转义
str3='shell "script" $n'      # 单引号之内只存在字符串#统计字符串中字符的个数                    
echo ${#n}             
echo ${#str3}    # 单引号中空格和符号也算
echo ${#str1}    # 双引号中空格和符号都不算

输出:注意第二行与第三行的区别

2
17
13

 

3.字符串拼接

#!/bin/sh# 字符串的拼接
shell='shell'
url='www.baidu.com'
s1=${shell}${url}# 两个变量之间加空格 需要用引号引起来
s2=${shell} ${url}   # 会报错
s3="${shell} ${url}"
s4=${shell}":"${url}
s5=${shell}:${url}
echo $s1
echo $s2
echo $s3
echo $s4
echo $s5

输出:注意空格的输出,两个变量之间加空格,需要用引号引起来,否则会报错。

demo4.sh:行28: www.baidu.com: 未找到命令
shellwww.baidu.comshell www.baidu.com
shell:www.baidu.com
shell:www.baidu.com

 

4.截取字符串

#!/bin/sh# 截取字符串
url='https://blog.csdn.net/zhangfei5354/article/details/136298293'# 从指定位置开始截取 ${string:start:length}  无法间隔着截取
echo ${url:0:10}
echo ${url:1}      # 从起始位置开始截取全部 
echo ${url:20:50}  # 截取范围超过最大长度时 截取完就结束
echo ${url:0-5:10} # 从右边开始截取  但方向还是从左往右
echo "----------------------------"# 从指定字符开始截取 ${string#*chars}  截取右边的字符
echo ${url#*blog}   # 截取blog后面的内容
echo ${url#*/}      # 匹配第一个遇到的/
echo ${url##*/}     # 匹配最后一个/ 在这个字符串里也可以使用s/去精准匹配
echo "----------------------------"# 截取左边的字符 ${string%chars*}
echo ${url%zhangfei*} 
echo ${url%a*}         # 匹配最右边的a左边的内容
echo ${url%%a*}        # 匹配最左边的子串

输出:注意不同起始位置截取时写法的不同,以及截取左右方向的选择。

https://bl
ttps://blog.csdn.net/zhangfei5354/article/details/136298293
t/zhangfei5354/article/details/136298293
98293
----------------------------
.csdn.net/zhangfei5354/article/details/136298293
/blog.csdn.net/zhangfei5354/article/details/136298293
136298293
----------------------------
https://blog.csdn.net/
https://blog.csdn.net/zhangfei5354/article/det
https://blog.csdn.net/zh

截取操作汇总:

 

总结

Shell编程与python大同小异,与python对照着学习更容易理解。

相关文章:

Linux-3:Shell编程——基础语法(0-50%)

目录 前言 一、变量 1.定义变量 2.使用变量 3.修改变量 4.将命令的结果赋值给变量 5.只读变量 6.删除变量 二、传递参数 三、字符串 1.字符串举例 2.统计字符串长度 3.字符串拼接 4.截取字符串 总结 前言 Shell是一种程序设计语言。作为命令语言,它…...

C++ --> string类模拟实现(附源码)

欢迎来到我的Blog,点击关注哦💕 前言: C中STL扮演着极其重要的角色,学习C重中之重的就是学习STL,虽然string不作为containers的其中一员,但是也是值得学习的le类。下面就进行string的模拟实现 string的模拟…...

基于PHP+MySQL组合开发的微信活动投票小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 在当今数字化时代,微信作为社交媒体的巨头,为企业和个人提供了丰富的互动营销平台。其中,投票活动作为一种有效的用户参与和互动方式,被广泛应用于各种场景。为了满足这一需求,我们推出了一款基于PHPMySQL组…...

利用Arcgis设置分式标注(分子分母标注)

因工作需要,需要设置分式标注,下面详细介绍下如何利用arcgis 设置分式标注,以下操作以供参考,如有疑义可提出。 一、准备工作 软件:arcmap 示例数据:行政区shp矢量图 二、操作步骤 1.添加数据 将行政区sh…...

大麦网抢票攻略:使用Python Selenium实现

随着互联网技术的发展,在线购票已成为人们获取演出、比赛等活动门票的主要方式。然而,面对热门活动,门票往往在开售瞬间被抢购一空。为了解决这一问题,本文将介绍如何利用Python和Selenium技术实现大麦网的自动抢票。 1. 环境准备…...

Navicat 在整个数据库中查找字符

Navicat 在整个数据库中查找字符 1.首先打开Navicat,连接目标数据库。2.选择工具选项卡,选择在数据库或模式中查找。3.查找前填入关键字信息,点击查找4.双击查找到数据,进行查看 说明:当我们知道数据库有数据的关键字,…...

Python基础—处理时间问题

一文帮助您解决99%时间处理问题...

如何选择合适的自动化测试工具!

选择合适的自动化测试工具是一个涉及多方面因素的决策过程。以下是一些关键步骤和考虑因素,帮助您做出明智的选择: 一、明确测试需求和目标 测试范围:确定需要自动化的测试类型(如单元测试、集成测试、UI测试等)和测试…...

数字图像边缘曲率计算及特殊点检测

一、曲率和数字图像边缘曲率检测常用方法简介 边缘曲率作为图像边缘特征的重要参数,不仅反映了边缘的几何形状信息,还对于图像识别、图像分割、目标跟踪等任务具有显著影响。 曲线的曲率(curvature)就是针对曲线上某个点的切线方向…...

python map

在 Python 中,如果你指的是字典(dictionary),可以使用字典的 .items() 方法来遍历键值对。Python 中没有严格意义上的 Map 类型,而是使用字典来实现类似于键值对映射的功能。 遍历字典的键值对 可以使用 for 循环和 …...

每日一练 - NFV部署应用环境

01 真题题目 NFV 常常部署在下列哪些应用环境中?(多选) A.数据中心 B.网络节点 C.用户接入侧 D.客户机/服务器 02 真题答案 ABC 03 答案解析 NFV(Network Functions Virtualization,网络功能虚拟化)是一种技术,它允许在标准的…...

031-GeoGebra中级篇-GeoGebra的布尔值

在 GeoGebra 中,布尔值和条件判断是实现动态数学模型和交互式几何图形的重要工具。布尔值,即逻辑值,只有两个可能的取值:真(True)或假(False)。通过使用布尔值,我们可以创…...

基于Debian用户安装星火商店

星火商店下载地址:https://www.spark-app.store/ 本文章我以kali linux来做示范 注:基本debian的linux包括ubuntu,mint linux,kali linux,Pop!_OS,deepin等等 1.点击下载最新版本 2.点击下载 3.点击开始下载(它会自动跳转网页) 4.选择要下载…...

《计算机网络》(第8版)课后习题答案

【1-01】 计算机网络可以向用户提供哪些服务? 解答:这道题没有现成的标准答案,因为可以从不同的角度来看“服务”。 首先要明确的是,计算机网络可以向用户提供的最重要的功能有两个:连通性和共享。所 谓连通性,就是计算机网络使上网用户之间都可以交换信息,好像这些用户…...

我们的网站被狗爬了!

大家好,我是程序员鱼皮。 世风日下,人心不古。我们的程序员面试刷题网站 《面试鸭》 才刚刚上线了一个多月,就由于过于火爆,被不少同行和小人发起网络攻击。 而且因为我们已经有 4500 多道人工整理的企业高频面试题、100 多个各…...

docker安装与container基本使用

安装 Homebrew 的 Cask 已经支持 Docker for Mac, mac用户狂喜 brew install --cask --appdir/Applications docker其他入门用法可参考 Docker Hello World- 菜鸟教程 或网上自行搜索博客学习。本文主要记录我运行go-zero-mall用到的一些注意点。当然,gonivinck项…...

掌握文本搜索的利器:深入解析 Linux grep 命令的强大功能

grep 是一个强大的命令行工具,用于在文件中搜索指定的模式(字符串或正则表达式)。它的名字来源于 "global regular expression print",常用于文本处理、日志分析等任务。以下是 grep 命令的详细介绍和常用操作: 基本用法 搜索匹配的行 grep "pattern"…...

【天机学堂】面试总结

写在前面,首先要将天机学堂包装一下,智慧教育平台》,暂时就想到这个。天机学堂文档 1.包装简历 待更新。。。...

Java中Stream操作

Java中Stream操作 Stream 和 Optional区别 用途不同:Stream 用于处理集合中的元素序列,支持丰富的中间操作和终端操作;Optional 用于表示一个值可能为 null 的情况,提供了一种更优雅的处理方式。数据处理 vs. 容器:S…...

Spring Boot + MinIO 实现文件的分片上传、秒传、续传功能

文件上传是一个常见的功能需求。然而,传统的文件上传方式在面对大文件或不稳定的网络环境时,可能会出现性能瓶颈和上传失败的问题。为了解决这些问题,分片上传、秒传和续传技术应运而生. 技术选型 Spring Boot:一个快速开发框架,简化了 Spring 应用的搭建和配置。 MinIO:…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

数据链路层的主要功能是什么

数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...