Linux之shell详解(Linux Shell Detailed Explanation)

news2024/10/9 6:00:03

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 IT核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云计算、人工智能、运维开发、算法结构、物联网、JAVA Python语言等。
不同类型针对性训练,提升编程思维,剑指大厂非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

Linux之shell详解

一、shell的介绍

Shell ⼀个命令解释器,它接收应⽤程序/⽤户命令,然后调⽤操作系统内核。 Shell还是⼀个功能强⼤的编程语⾔,易编写、易调试、灵活性强。

(1)  Linux提供的shell解释器有

(2) bash 和 sh的关系

(3)  Centos默认的Shell解析器是bash

二、变量名的定义规则

  1. 变量名称可以由字⺟、数字和下划线组成,但是不能以数字开头,环境变量名建议⼤ 写。
  2. 等号两侧不能有空格
  3. 在bash中,变量默认类型都是字符串类型,⽆法直接进⾏数值运算。
  4. 变量的值如果有空格,需要使⽤双引号或单引号括起来

2.1  等号周围没有空格 

对于许多语⾔,例如 Python,在等号周围添加空格是⼀个好习惯,因为它可以提⾼代码的可读性。 但是在 Bash 中,不应该在定义变量时添加额外的空格。如下示例:

  1. name="小美" #正确

  2. name = "小美" #错误

  3. [root@iZ2zeh6vyxsq620zifz8jaZ~]# username="小 美" #引号内可加空格

  4. [root@iZ2zeh6vyxsq620zifz8jaZ]#echo $username

  5. 小 美

2.2 正确地定义数组

在 Bash 中定义⼀个数组并不难。只需要使⽤⼀对括号来包含所有元素。如下示例:

注意:分隔数组中每个元素用空格!!!

arr=("陈少熙" "何浩楠" "王一珩") #等号两边不要空格,字符串之间要用空格分隔



#遍历数组

[root@iZ2zeh6vyxsq620zifz8jaZ ~]# arr=("陈少熙" "何浩楠" "王一珩")

[root@iZ2zeh6vyxsq620zifz8jaZ ~]# echo $arr

陈少熙

[root@iZ2zeh6vyxsq620zifz8jaz ~]# echo ${arr[1]}

"何浩楠"

[root@iZ2zeh6vyxsq620zifz8jaZ ~]# echo ${arr[2]}

"王一珩"

2.3  查看所有的变量 set

set     #查看所有变量名

set     #查看所有变量名

set username

2.4  取消变量的设置 unset

unset 变量名    #删除环境变量

unset username     #取消变量名的设置

2.5  将局部环境变量提升为全局 export

export 变量名

2.6   正确选择引号

当在 Bash 中声明⼀个变量时,关于引号的使⽤有 3 个可选的⽅案:

  • 没有引号
  • ⽤单引号
  • ⽤双引号

        默认情况下,Bash 中的每个值都是⼀个字符串。因此,如果不需要空格,就不需要使⽤任何引号。(同 样,它与其他语⾔有些不同,在其他语⾔中,您不能在没有引号的情况下定义字符串)。

2.6.1 单引号和双引号之间的区别

当需要使⽤引号时,请注意单引号和双引号之间的区别。如下示例。

(1) 单双引号不影响纯字符串

 (2)单引号双引号区别:⼀对单引号内的字符串将始终被解释为它的本身。双引号可以转义。2.7   避免在命令中使⽤反引号

在 Bash 中,可以将命令的结果保存到变量中。如下保存命令方法:

file_list=`ls`

file_list=$(ls)

但是,这⾥的最佳实践始终是使⽤第⼆种⽅法,尤其是在编写较⻓的脚本时。因为反引号和单引号看起 来很相似,有时可能会混淆它们。

2.8  特殊的变量名

2.8.1.$n

$n(功能描述:n为数字,$0代表该脚本名称,$1-$9代表第⼀到第九个参数,⼗以上的参数需要 ⽤⼤括号包含,如${10})

2.8.2. $#

$# (功能描述:获取所有输⼊参数个数,常⽤于循环)。

2.8.3. $*

$* (功能描述:这个变量代表命令⾏中所有的参数,$*把所有的参数看成⼀个整体)

2.8.4. $@

$@ (功能描述:这个变量也代表命令⾏中所有的参数,不过$@把每个参数区分对待)

2.8.5. $?

$? (功能描述:最后⼀次执⾏的命令的返回状态。如果这个变量的值为0,证明上⼀个命令正 确执⾏;如果这个变量的值为⾮0(具体是哪个数,由命令⾃⼰来决定),则证明上⼀个命令执⾏ 不正确了。)

三、运算符

3.1 算数运算符

(1)“ $((运算式)) ” 或  “ $[运算式] ”

(2)expr + , - , \*, /, % 加,减,乘,除,取余

注意:expr运算符间要有空格


3.2 逻辑运算符 

格式:[ 条件 ] 注意:[] ⾥⾯前后必须要有空格

结果:0 表示真 ⾮0表示假

(1)两个整数之间⽐较
  • = 字符串⽐较 -lt ⼩于(less than)
  • -le ⼩于等于(less equal)
  • -eq 等于(equal)
  • -gt ⼤于(greater than)
  • -ge ⼤于等于(greater equal)
  • -ne 不等于(Not equal)
(2)按照⽂件权限进⾏判断
  • -r 有读的权限(read)
  • -w 有写的权限(write)
  • -x 有执⾏的权限(execute)
(3)按照⽂件类型进⾏判断
  • -f ⽂件存在并且是⼀个常规的⽂件(file)
  • -e ⽂件存在(existence)
  • -d ⽂件存在并是⼀个⽬录(directory)
(4)多条件判断
  • && 表示前⼀条命令执⾏成功时,才执⾏后⼀条命令
  • || 表示上⼀条命令执⾏ 失败后,才执⾏下⼀条命令

四、正则表达式

        正则表达式使⽤单个字符串来描述、 匹配⼀系列符合某个语法规则的字符串。 在很多⽂本编辑器⾥, 正则表达式通常被⽤来检索、 替换那些符合某个模式的⽂本。 在 Linux 中, grep,sed, awk 等⽂本 处理⼯具都⽀持通过正则表达式进⾏模式匹配。

4.1. 常规匹配

        例如下⾯的命,会对/etc/passwd的每⾏内容进⾏匹配,将含有root的⾏输出

[root@test001 ~]# cat /etc/passwd | grep root

4.2. 常⽤的特殊字符串

4.2.1. 特殊字符:^

^ 匹配⼀⾏的开头,如下,会匹配/etc/passwd中以root开头的⾏

[root@test001 ~]# cat /etc/passwd | grep ^root
4.2.2. 特殊字符:$

$ 匹配⼀⾏的结尾,如下,会匹配出/etc/passwd中以bash结尾的⾏

[root@test001 ~]# cat /etc/passwd | grep bash$
4.2.3. 特殊字符:.

. 匹配⼀个任意字符,如下,可以匹配含有四个字符,其中第1个字符是r,第4个字符是t的⾏,中间两个 可以是任意字符

[root@test001 ~]# cat /etc/passwd | grep r..t
4.2.4. 特殊字符:*

* 不单独使⽤,他和上⼀个字符连⽤,表示匹配上⼀个字符0次或多次,如下,可以匹配第1个字符是r, 最后1个字符是t,中间可以包含任意数量的o

[root@test001 ~]# cat /etc/passwd | grep ro*t
4.2.5. 字符区间(中括号):[]

[] 表示匹配某个范围内的⼀个字符,例如

[6,8]匹配6或者8
[0-9]匹配1个0-9的数字
[0-9]*匹配任意⻓度的数字字符串
[a-z]匹配1个a-z之间的字符
[a-z]*匹配任意⻓度的字⺟字符串
[a-ce-f]匹配a-z或者e-f之间的任意⼀个字符
[root@test001 ~]# cat /etc/passwd | grep "[a-z]*"
4.2.6. 特殊字符:\

\ 表示转义,并不会单独使⽤,由于所有特殊字符都有其特定的匹配模式,当匹配某⼀特殊字符本身时 (例如,我想找出所有包含‘$’的⾏),就会碰到困难,此时就要将转义字符和特殊字符连⽤,来表示特 殊字符本身,例如

[root@test001 ~]# echo "abc$" | grep "\\$"

abc$

[root@test001 ~]# echo "abc$" | grep '\$'

abc$
4.2.7 扩展的正则表达式

        这⾥说⼀下,有些语⾔中⽀持正则表达式的扩展语法,如{n,m}等等,对于这种,使⽤grep匹配的时候, 需要添加-E选项,否则⽆法识别这种语法。

⽐如下⾯2⾏,匹配a-z中的任意字符2或者3次

[root@test001 ~]# echo "ab,cdre" | grep "[a-z]{2,3}"

[root@test001 ~]# echo "ab,cdre" | grep -E "[a-z]{2,3}"

ab,cdre

五、条件选择、判断

5.1. 条件选择 if

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

5.1.1. ⽤法格式
  1. if 判断条件 1 ; then

  2. 条件为真的分⽀代码

  3. elif 判断条件 2 ; then

  4. 条件为真的分⽀代码

  5. elif 判断条件 3 ; then

  6. 条件为真的分⽀代码

  7. else

  8. 以上条件都为假的分⽀代码

  9. fi

练习:写⼀个脚本传⼊⼀个分数参数 判断是如果⼤于90输出优秀,如果⼤于70输出优良,如果⼤于60 输出及格,如果⼩于60输出挨打

echo "请输入分数:"

read score

if [ $score -gt 90 ]; then

echo "优秀"

elif [ $score -gt 70 ];then

echo "优良"

elif [ $score -gt 60 ];then

echo "及格"

else

echo "挨打"

fi
  1. 5.2. 条件判断 case

注意事项:

1) case⾏尾必须为单词“in”,每⼀个模式匹配必须以右括号“)”结束。

2) 双分号“;;”表示命令序列结束,相当于java中的break。

3) 最后的“*)”表示默认模式,相当于java中的default。

5.2.1. ⽤法格式
case $name in

PART1)

cmd

;;

PART2)

cmd

;;

*)

cmd

;;

esac

5.3. 循环(四种)

 5.3.1. for
5.3.1.1. ⽤法格式
  1. # ⽅式⼀

  2. for name in 列表 ;do

  3. 循环体

  4. done

  5. # ⽅式⼆ 类似于C语⾔⻛格的语法

  6. for (( 初始值; 条件表达式; 变量改变 )) ;do

  7. cmd

  8. done

练习:做⼀个100以内的累加并输出结果

sum=0

for i in {1..100}; do

sum=$((sum + i))

done

echo "1 到 100 的累加结果为: $sum"

对上⾯的$* 和 $@ 做对⽐

5.3.2. while

5.3.2.1. ⽤法格式
  1. while 循环控制条件 ;do

  2. 循环

  3. done

        循环控制条件;进⼊循环之前,先做⼀次判断;每⼀次循环之后会再次做判断;条件为“ true ” ,则 执⾏⼀次循环;直到条件测试状态为“ false ” 终⽌循环

5.3.3. until 循环
5.3.3.1. ⽤法
  1. unitl 循环条件 ;do

  2. 循环

  3. done

        进⼊条件:循环条件为true ;退出条件:循环条件为false;刚好和while相反,所以不常⽤,⽤while就 ⾏

5.3.4. select 循环与菜单
5.3.4.1. ⽤法
  1. select variable in list

  2. do

  3. 循环体命令

  4. done

① select 循环主要⽤于创建菜单,按数字顺序排列的示菜单项将显示在标准错误上,并显示PS3 提示 符,等待⽤户输⼊

② ⽤户输⼊菜单列表中的某个数字,执⾏相应的命令

③ ⽤户输⼊被保存在内置变量 REPLY 中

④ select 是个⽆限循环,因此要记住⽤ break 命令退出循环,或⽤ exit 按 命令终⽌脚本。也可以按 ctrl+c退出循环

⑤ select 和 经常和 case 联合使⽤

⑥ 与for循环类似,可以省略 in list, 此时使⽤位置参量

5.3.4.2. 案例
PS3="请输⼊你要选择的序号: "

select menu in ⽶饭 扯⾯ 包⼦ 稀饭 退出

do

case $REPLY in

1|4)

echo "$menu 价格是 15"

;;

2|3)

echo "$menu 价格是 20"

;;

5)

break

;;

*)

echo "请你好好选"

esac

done

分析: PS3 是 select 的提示符,⾃动⽣成菜单,选择5 break 退出循环。

5.4. 循环⾥的⼀些⽤法

5.4.1. 循环控制语句
5.4.1.1. 语法

continue :提前结束第N层的本轮循环,⽽直接进⼊下⼀轮判断;最内层为第1层 break :提前结 束第N层循环,最内侧为第1层

# 例:

while CONDTITON1; do

CMD1

if CONDITION2; then

continue / break

fi

CMD2

done

六、read 读取控制台输⼊

6.1. 语法

read(选项)(参数)

选项:

    -p:指定读取值时的提示符;

    -t:指定读取值时等待的时间(秒)。

参数

变量 ==> 指定读取值的变量名

七、⾃定义函数

7.1 语法

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

注意:

(1)必须在调⽤函数地⽅之前,先声明函数,shell脚本是逐⾏运⾏。不会像其它语⾔⼀样先编 译。

(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后⼀ 条命令运⾏结果,作为返回值。return后跟数值n(0-255)

#!/bin/bash

function sum()

{

s=0

s=$[$1 + $2]

echo $s

}

read -p "请输⼊第⼀个数" NUM1

read -p "请输⼊第⼆个数" NUM2

sum $NUM1 $NUM2

 练习:编写⼀个函数来计算输⼊的是不是⼀个质数

function zhi()

{

num=$1

isok=1

for((i=2; i<$num; i++))

do

if [ $[$num % $i ] -eq 0];then

isok=0

break

fi

done


if [ $isok -eq 1 ]

then

echo "$1是一个质数"

else

echo "$1不是质数"

fi

}

read -p "请输入一个数" NUM1

zhi $NUM1

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

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

相关文章

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【285-296】

文章目录 285. 为什么需要继承286. 继承原理图287. 继承快速入门288. 289. 290. 291. 292. 继承使用细节1,2,3,4,5288.1 继承给编程带来的便利288.2 继承的深入讨论/细节问题 293. 继承本质详解294. 继承课堂练习1295. 继承课堂练习2296. 继承课堂练习3 285. 为什么需要继承 28…

【软件部署安装】OpenOffice转换PDF字体乱码

现象与原因分析 执行fc-list查看系统字体 经分析发现&#xff0c;linux默认不带中文字体&#xff0c;因此打开我们本地的windows系统的TTF、TTC字体安装到centos机器上。 安装字体 将Windows的路径&#xff1a; C:\Windows\Fonts 的中文字体&#xff0c;如扩展名为 TTC 与TT…

App模拟心跳长连接的实现方法demo

摘要 背景&#xff1a;心跳通常是指客户端或服务器定期发送一个小型的、空的消息以保持连接的活动状态。它用于检测连接是否仍然有效&#xff0c;并防止连接由于长时间没有活动而被关闭。 技术原理&#xff1a;App定时发消息给服务器&#xff0c;服务器回消息表示连接依旧有效…

手机竖屏 Premiere Pro 电影转场特效视频模板Pr工程文件

10个不同的类别和115个过渡。过渡很容易使用。随附视频教程。 下载地址&#xff1a;Pr模板网 下载链接&#xff1a;https://prmuban.com/40597.html

动态规划算法专题(五):子序列问题

目录 1、最长递增子序列 1.1 算法原理 1.2 算法代码 2、摆动序列 2.1 算法原理 2.2 算法代码 3、最长递增子序列的个数 3.1 算法原理 3.2 算法代码 4、最长数对链 4.1 算法原理 4.2 算法代码 5、最长定差子序列 5.1 算法原理 5.2 算法代码 6、最长的斐波那契子序…

NASA:气象追踪分子光谱(ATMOS)二级产品,包含在垂直高度(公里)网格上的微量气体

目录 简介 摘要 引用 网址推荐 0代码在线构建地图应用 机器学习 ATMOS L2 Trace Gases on Altitude Grid, Tab Delimited Format V3 (ATMOSL2AT) at GES DISC 简介 这是版本3的气象追踪分子光谱&#xff08;ATMOS&#xff09;二级产品&#xff0c;包含在垂直高度&#…

多线程股吧(东方财富)用户信息爬取

多线程东方财富&#xff08;股吧&#xff09;用户信息爬取 在上一篇博客股吧信息爬取的基础上加入了多线程&#xff0c;使得速度提升了十几倍&#xff0c;爬取内容如下&#xff1a; 最终爬取结果如下&#xff1a; 完整代码如下&#xff08;准备好环境&#xff0c;比如pytho…

安宝特案例 | Fundació Puigvert 医院应用AR技术开创尿石症治疗新纪元

案例介绍 在医疗科技不断进步的今天&#xff0c;Fundaci Puigvert 医院迈出了重要一步&#xff0c;成功应用AR技术进行了全球首例同时使用两台内窥镜的ECIRS手术&#xff08;内镜肾内联合手术&#xff09;&#xff0c;由Esteban Emiliani M.D. PhD F.E.B.U 博士主刀。这标志着…

yub‘s Algorithmic Adventures_Day7

环形链表 link&#xff1a;https://leetcode.cn/problems/linked-list-cycle-ii/description/ 思路分析 我只能说双指针yyds【刻板hh】 我们分两种情况来分析 起码在第二圈才会相遇 fast比slow多走环的整数倍 fast 走的步数是 slow 步数的 2 倍&#xff0c;即 f2s&#xff…

5.资源《Arduino UNO R3 proteus 使用CD4511驱动数码管工程文件(含驱动代码)》说明。

资源链接&#xff1a; Arduino UNO R3 proteus 使用CD4511驱动数码管工程文件&#xff08;含驱动代码&#xff09; 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;proteus工程&#xff0c;内含设计图和工程代码。 3.内容展示 4.简述 工程功能可以看这个视频 数码…

微信小程序流量主

开发小程序也已经有一段时间了,也是为了添加流量主来开发小程序,根据小程序的定位,来获取用户想要的资源,通过广告的形式来增加用户的点击量进行收益,收益虽然微不足道,但是也是很有成就感的

活动邀请 | SonarQube×创实信息即将亮相2024 GOPS全球运维大会-上海站,分享代码质量与安全提升策略

2024年10月18日-19日&#xff08;周五-周六&#xff09;&#xff0c;第二十四届 GOPS 全球运维大会上海站将在上海中庚聚龙酒店举办。 大会为期2天&#xff0c;侧重大模型、DevOps、SRE、AIOps、BizDevOps、云原生及安全等热门技术领域。特设了如大模型 运维/研发测试、银行/…

宠物咖啡馆服务平台:SpringBoot技术深度解析

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…

2024_10_8 系统进展

改进位置 发现是label_api里藏了我需要改进的东西 settings.py 数据库 我这边电脑上使用的是windows 192 vue.config.js 陈家强是这样设置的 module.exports {publicPath: process.env.NODE_ENV production? /: /,assetsDir: static,// css: {// extract: false// },…

使用XML实现MyBatis的基础操作

目录 前言 1.准备工作 1.1⽂件配置 1.2添加 mapper 接⼝ 2.增删改查操作 2.1增(Insert) 2.2删(Delete) 2.3改(Update) 2.4查(Select) 前言 接下来我们会使用的数据表如下&#xff1a; 对应的实体类为&#xff1a;UserInfoMapper 所有的准备工作都在如下文章。 MyBati…

《大规模语言模型从理论到实践》第一轮学习--Fine-tuning微调

第一轮学习目标&#xff1a;了解大模型理论体系 第二轮学习目标&#xff1a;进行具体实操进一步深入理解大模型 从大语言模型的训练过程来理解微调 大预言模型训练主要包含四个阶段&#xff1a;预训练、有监督微调、奖励建模、强化学习。 预训练&#xff08;Pretraining&…

[paddle]paddleseg快速开始

快速开始 为了让大家快速了解PaddleSeg&#xff0c;本文档使用一个简单示例进行演示。在实际业务中&#xff0c;建议大家根据实际情况进行调整适配。 在开始下面示例之前&#xff0c;请大家确保已经安装好PaddleSeg开发环境&#xff08;安装说明&#xff09;。 1 准备数据 …

被AI坑的一天—CentOS7导入阿里云YUM源报错的 GPG密钥提示404

过于相信人工智能 配置YUM源根据AI的说法换阿里云的YUM源验证AI配置结果解决问题 配置YUM源 由于电脑受限制 , 不能访问境外网站,所以用不了centos自带的源 ,是报404的 根据AI的说法换阿里云的YUM源 编辑 /etc/yum.repos.d/CentOS-Base.repo ,更换为 配置完成后sudo yum …

nacos多数据源插件介绍以及使用

概述 在微服务架构中&#xff0c;服务配置的集中管理和动态调整是至关重要的。Nacos 提供了配置管理和服务发现的功能&#xff0c;其中配置管理支持动态数据源的切换&#xff0c;增强了其在复杂环境中的适用性。默认情况下&#xff0c;Nacos 支持 MySQL 和Derby&#xff0c;但…

C++——AVL树的模拟实现

目录 一、AVL树结点 二、AVL树结构 三、插入数据&#xff08;重点&#xff09; 1、右单旋 2、左单旋 3、左右双旋 4、右左双旋 AVL树是一颗平衡二叉搜索树&#xff0c;它的本质就是一颗之前说过的二叉搜索树。但是二叉搜索树可能会出现极端情况&#xff0c;导致二叉搜索树变…