shell详细介绍(清晰明了)

news2024/11/27 20:40:30

一、shell的介绍

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

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

(2) bash 和 sh的关系

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

二、变量名的定义规则

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

2.1  等号周围没有空格 

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

name="小美"           #正确
name = "小美"         #错误

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

2.2 正确地定义数组

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

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

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


#遍历数组
[root@iZ2zeh6vyxsq620zifz8jaZ ~]# arr=("陈少熙" "何浩楠" "王一珩")  
[root@iZ2zeh6vyxsq620zifz8jaZ ~]# echo $arr
陈少熙
[root@iZ2zeh6vyxsq620zifz8jaz ~]# echo ${arr[1]}
"何浩楠"
[root@iZ2zeh6vyxsq620zifz8jaZ ~]# echo ${arr[2]}
"王一珩"
[root@iZ2zeh6vyxsq620zifz8jaZ ~]# echo ${arr[3 ]}
[root@iZ2zeh6vyxsq620zifz8jaZ ~]# echo ${arr[*]}
陈少熙 "何浩楠" "王一珩"

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. ⽤法格式

if 判断条件 1 ; then
 条件为真的分⽀代码
elif 判断条件 2 ; then
 条件为真的分⽀代码
elif 判断条件 3 ; then
 条件为真的分⽀代码
else
 以上条件都为假的分⽀代码
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

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. ⽤法格式
# ⽅式⼀
for name in 列表 ;do
 循环体
done
# ⽅式⼆ 类似于C语⾔⻛格的语法
for (( 初始值; 条件表达式; 变量改变 )) ;do
 cmd
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. ⽤法格式
while 循环控制条件 ;do
 循环
done

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

5.3.3. until 循环

5.3.3.1. ⽤法
unitl 循环条件 ;do
 循环
done

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

5.3.4. select 循环与菜单

5.3.4.1. ⽤法
select variable in list
do
 循环体命令
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/1938101.html

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

相关文章

前端学习(三)之CSS

一、什么是CSS html定义网页的结构和信息&#xff08;骨架血肉&#xff09;css定义网页的样式&#xff08;衣服&#xff09;js定义用户和网页的交互逻辑&#xff08;动作&#xff09; 通过CSS&#xff0c;可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景等样式&…

YOLOv8改进 | Neck | 注意力尺度序列融合的检测框架ASF-YOLO

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

spring boot(学习笔记第十四课)

spring boot(学习笔记第十四课) Spring Security的密码加密&#xff0c;基于数据库认证 学习内容&#xff1a; Spring Security的密码加密基于数据库认证 1. Spring Security的密码加密 如果用户的密码保存在数据库中是以明文保存&#xff0c;对于公司的安全将是灾难性的&…

SpringBoot中fastjson扩展: 自定义序列化和反序列化方法实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

安全防御---防火墙综合实验3

安全防御—防火墙综合实验3 一、实验拓扑图 二、实验要求 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区…

【软件配置】不使用ROS系统,不进行编译,纯python环境配置rosbag,从而解析.bag文件

【软件配置】不使用ROS系统&#xff0c;不进行编译&#xff0c;纯python环境配置rosbag&#xff0c;从而解析.bag文件 【anaconda】conda创建、查看、删除虚拟环境&#xff08;anaconda命令集&#xff09;_conda 创建环境-CSDN博客 【Windows配置三】Python3.6安装rosbag_ros…

4.基础知识-数据库技术基础

基础知识 一、数据库基本概念1、数据库系统基础知识2、三级模式-两级映像3、数据库设计4、数据模型&#xff1a;4.1 E-R模型★4.2 关系模型★ 5、关系代数 二、规范化和并发控制1、函数依赖2、键与约束3、范式★3.1 第一范式1NF实例3.2 第二范式2NF3.3 第三范式3NF3.4 BC范式BC…

鸿蒙智联:一统多设备,跨端融合新魔法

在当今科技飞速发展的时代&#xff0c;操作系统的优劣直接影响着用户的体验和设备的性能。而鸿蒙系统&#xff0c;宛如一颗璀璨的新星&#xff0c;凭借其卓越的跨端能力&#xff0c;为我们展现了一个全新的科技世界。 鸿蒙系统的最大魅力之一&#xff0c;就在于它能够实现一个系…

【嵌入式开发之数据结构】树的基本概念、逻辑结构和四种常用的遍历算法及实现

树&#xff08;Tree&#xff09;的定义及基本概念 树的定义 树(Tree)是个结点的有限集合T&#xff0c;它满足两个条件&#xff1a; 有且仅有一个特定的称为根&#xff08;Root&#xff09;的节点&#xff1b;其余的节点分为个互不相交的有限合集&#xff0c;其中每一个集合又…

【无重叠空间】python刷题记录

润到贪心篇。 class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:#十行贪心大神if not intervals:return 0#按照第第二个元素进行排序&#xff0c;贪心思想&#xff0c;参考活动安排都是以结束时间进行排序的intervals.sort(keylambda x:…

分离式网络变压器的集成化设计替代传统网络变压器(网络隔离滤波器)尝试

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是应用了分离式网络变压器设计的的新型网络变压器&#xff08;网络隔离变压器&#xff09; 今天我们一起来看这款新型网络变压器&#xff0c;它就是应用分离式网络变压器集成到电路板上&#xff0c;加上外…

git协同开发与冲突解决

协同开发流程 基本的使用方法 # 1 多人开发同一个项目-张三&#xff1a;本地 版本库-李四&#xff1a;本地 版本库-我&#xff1a; 本地 版本库----远程仓库&#xff1a;本地版本库内容--》推送到远程仓库-----# 2 演示&#xff08;我是项目管理员&#xff09;-1 增加几个开发…

(二刷)代码随想录第21天|236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 递归三部曲&#xff1a; 1、确定参数和返回值&#xff1a; class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {} 2、确定中止条件&#xff1a; if (root null || root p || root q) { // 递归结…

lua 游戏架构 之 SceneLoad场景加载之 SceneBase (三)

谢谢大家关注一下啊我的微信 框架上 设计一个 基类 SceneLoad&#xff1a;BaseSceneLoad lua 游戏架构 之 SceneLoad场景加载&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/heyuchang666/article/details/140560014?spm1001.2014.3001.5501 设计多个 场景类&a…

无需业务改造,一套数据库满足 OLTP 和 OLAP,GaiaDB 发布并行查询能力

在企业中通常存在两类数据处理场景&#xff0c;一类是在线事务处理场景&#xff08;OLTP&#xff09;&#xff0c;例如交易系统&#xff0c;另一类是在线分析处理场景&#xff08;OLAP&#xff09;&#xff0c;例如业务报表。 OLTP 数据库擅长处理数据的增、删、改&#xff0c…

STM32测测速---编码电机读取速度的计算

1、首先先了解一下计算的公式 速度计算&#xff1a; 轮胎每转一圈的脉冲数取决于编码器的分辨率&#xff0c;可由下面公式进行计算&#xff1a; PPR是电机的线数 以GA25-370电机为例。 图片来源&#xff1a;第四节&#xff1a;STM32定时器&#xff08;4.JGA25-370霍尔编码器…

规范:前端工程代码规范

准备工作 前端工程化介绍 前端工程化是指将前端开发流程标准化、自动化和模块化的过程。以下是一些常见的步骤或配置&#xff1a; 代码版本控制&#xff1a;使用 Git 等版本控制系统来管理代码的变更和协作。 依赖管理&#xff1a;使用 npm 或 yarn 等包管理工具来管理项目依…

园区道路车辆智能管控视频解决方案,打造安全畅通的园区交通环境

一、背景需求分析 随着企业园区的快速发展和扩张&#xff0c;道路车辆管理成为了保障园区秩序、提升运营效率及确保员工安全的重要任务。针对这一需求&#xff0c;旭帆科技TSINGSEE青犀提出了一种企业园区道路车辆管控的解决方案&#xff0c;通过整合视频监控、智能识别等技术…

6.2 基础功能介绍

本节重点介绍 : 数据源操作新增一个数据源dashboard操作folder操作alerting操作用户和组操作 本节重点总结 : 数据源操作dashboard操作folder操作alerting操作用户和组操作

linux时间服务器——软件安装,配置时间服务器客户端 ,配置时间服务器服务端

1 、软件安装 # 设置当前时区 [rootlocalhost ~] # timedatectl set-timezone Asia/Shanghai [rootlocalhost ~] # yum install -y chrony [rootlocalhost ~] # systemctl enable --now chronyd [rootserver1 ~] # cat /etc/chrony.conf # 设置时间服务器的服务端名字 s…