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

news2025/4/19 8:07:03

目录

前言

一、变量

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/sh

a="hello world"
b=helloworld
c='hello world'

 

2.使用变量

  • 使用一个定义过的变量,只要在变量名前面加美元符号$即可
  • 变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
  • 当变量与其他字符相连时,应使用花括号
#!/bin/sh

a="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/sh


tt="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 good
 is 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/sh

n=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/sh

n=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.com

shell 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对照着学习更容易理解。

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

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

相关文章

算法学习day26

滑动窗口系列题 一、替换后的最长重复子串 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后,返回 包含相同字母的最长子字符串的长度。 输入&#xff1a…

MySQL--MySQL函数

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 MySQL函数 一、MySQL函数简介 函数表示对输入参数值返回一个具有特定关系的值,MSOL提供了大量丰富的函数,在进行数据库管理以…

CTFHub——XSS全系列

1、反射型: 发现为表单式,猜测哪个可能存在注入漏洞,分别做测试注入发现name框存在xss漏洞 输入发现有回显但不是对方cookie,参考wp发现要用xss线上平台 将xss平台测试语句注入,将得到的url编码地址填入url框&#xf…

Mongodb集合操作

文章目录 1、进入容器2、如果数据库不存在,则创建数据库,否则切换到指定数据库3、在 MongoDB 中,创建集合不是必须操作。当你插入一些文档时,MongoDB 会自动创建集合。4、查看数据库列表5、查看集合6、显示创建集合7、删除集合 1、…

Raspberry Pi Docker 运行 IRIS

在 Raspberry Pi 上成功安装 Docker 后可以安装 IRIS 数据库。 安装的命令为: docker run --name my-iris -d --publish 1972:1972 --publish 52773:52773 intersystems/irishealth-community:latest-em-linux-arm64v8 注意,我们这里暴露了 2 个端口&a…

Spring框架 配置Gateway网关/spring cloud gateway 基础入门案例教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 网关作为微服务集群唯一的对外入口,可以实现很多功能. 例如: 统一的解决跨域(一个ajax请求 origin域名和请求目标url中域名不同,ip不同,域名不同,端口不同,都会引发的问题)问题. 统一的身份认证.认证解…

OpenStack Yoga版安装笔记(十)placement练习

1、练习场景说明 在OpenStack Yoga版安装笔记(九)中,placement已经在controller node虚拟机上安装完成,并且已经成功拍摄了快照。 此时,controller node虚机已经安装了keystone、keystone DB、glance、glance DB、Open…

反序列化漏洞vulhub靶场serial

环境搭建 下载 https://download.vulnhub.com/serial/serial.zip 解压出来就是这种 你会得到一个这样的文件,这里使用VMware新建一个虚拟机,这里记录比较重要的几部分。 这里就是使用我们刚才下过来的。 漏洞过程详解 1.信息收集 打开靶机&#xff0…

干货满满,从零到一:编程小白如何在大学成为编程大神?

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

Git(4) 解决Git相关问题的实用技巧

本文将介绍一些Git实用的技巧,实际操作中解决常见的Git问题。 问题1:将本地项目推送到远程仓库 如何将本地项目推送到远程仓库,包括处理常见错误的方法,并最终将代码推送到 main 分支。 步骤 1. 初始化本地仓库 确保已经在本地…

类和对象的深入了解6

1.初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括 号中的初始值或表达式。 class Date { public:Date(int year, int month, int day): _year(year), _month(month),…

Cellpress|单细胞文章|单细胞转录和大队列食管癌免疫治疗

新辅助免疫检查点阻断 (ICB) 在可手术食管鳞状细胞癌 (ESCC) 中显示出希望,但缺乏可用的疗效生物标志物。该文章对接受新辅助 ICB 的 ESCC 患者的肿瘤进行单细胞 RNA 测序,发现一组表达SPRY1 (CD8 Tex-SPRY1) 的耗竭 CD8 T 细胞亚群,其显示…

72.结构体变量直接赋值

目录 一.结构体变量直接赋值 二.视频教程 一.结构体变量直接赋值 通过上节课的学习得出了一个结论:俩个相同类型的结构体变量直接可以只用赋值号进行赋值。 像这样: struct test {int a;int b; };int main(void) {struct test x {1,2};struct test …

反序列化靶机实战serial(保姆级教程)

一.信息收集 靶机地址下载:https://download.vulnhub.com/serial/serial.zip 打开靶机,在kali虚拟机中进行主机存活探测 可以知道靶机ip地址为192.168.133.171 然后扫描端口 可以发现有一个22端口跟80端口 然后接下来用kali扫描它的目录 可以发现有一…

10年仓库管理经验:“管、存、发、盘”一文搞定!

前段时间去一家仓储设备公司交流学习,和一位有着10年经验的老仓管聊了个痛快,从他那儿学到了不少仓库管理的实践方法。 回来自己整理了一套仓库管理高效的实用方法,现在就来跟大家伙儿聊聊仓库管理中那些常见问题,以及我是怎么琢…

vite构建vue3项目hmr不生效问题踩坑记录

vite构建vue3项目hmr不生效问题踩坑记录 hmr的好处 以下是以表格形式呈现的前端开发中HMR(热模块替换)带来的好处: 好处描述提升开发效率允许开发者在不刷新整个页面的情况下实时更新修改的代码,减少等待时间保持应用状态在模块…

技术分享| 前端性能优化——虚拟滚动(Virtual Scroll)

前端遇到大量数据(尤其是大数据表)的DOM 渲染时,通常会卡顿,需要考虑优化性能问题,这里针对DOM 渲染引出“虚拟滚动”方案, 详细请在以下各文章中详细了解: vue插件 vue-virtual-scroll-list解决…

C语言| 文件操作详解(二)

目录 四、有关文件的随机读写函数 4.1 fseek 4.2 ftell 4.3 rewind 五、判定文件读取结束的标准与读写文件中途发生错误的解决办法 5.1 判定文件读取结束的标准 5.2 函数ferror与feof 5.2.1 函数ferror 5.2.2 函数feof 在上一章中,我们主要介绍了文件类型…

鸿蒙系统开发【事件订阅】网络

事件订阅 介绍 本示例通过ohos.telephony.observer等接口订阅网络状态、信号状态、蜂窝数据、sim状态等事件,并获取状态变化返回的结果。 效果预览 使用说明 1.打开应用,开启所有订阅事件开关。 2.开关一次移动网络,触发网络状态变化。 …