【Linux】Shell脚本基础+条件判断与循环控制

目录

一、介绍

1. Linux提供的Shell解析器

2. bash和sh关系   

3. Centos默认的Shell解析器是bash

二、定义

1. 变量名的定义规则

2. 等号周围没有空格

3. 查看变量

4. 删除变量

5. 正确地定义数组

6. 将局部环境变量提升为全局

7. 正确选择引号

8. 特殊变量名

三、运算符

1. 算术运算符

2. 逻辑运算符

3. 常用的特殊字符串

4. 正则表达式

5. 扩展的正则表达式

四、条件选择、判断

1. if

2. case

3. 循环

3.1 for

3.2 while循环

3.3 until 

3.4 select循环与菜单

五、read 读取控制台输⼊

六、⾃定义函数

七、练习


一、介绍

        Shell ⼀个命令解释器,它接收应⽤程序/⽤户命令,然后调⽤操作系统内核。

        Shell是⼀个功能强⼤的编程语⾔,易编写、易调试、灵活性强。

1. Linux提供的Shell解析器

        cat /etc/shells

vim hello.sh       

chmod u+x hello.sh            设置权限

./hello.sh 或   sh hello.sh  或 bash hello.sh    控制台输出

2. bash和sh关系   

        软连接

3. Centos默认的Shell解析器是bash

        echo $SHELL     环境变量

二、定义

1. 变量名的定义规则

(1)变量名称可以由字⺟、数字和下划线组成,但是不能以数字开头,环境变量名建议⼤写。

(2)等号两侧不能有空格

(3)在bash中,变量默认类型都是字符串类型,⽆法直接进⾏数值运算。

(4)变量的值如果有空格,需要使⽤双引号或单引号括起来。

2. 等号周围没有空格

        username="小明"

        echo $username

        username="小 红"

        username=小红

3. 查看变量

        set               查看所有环境变量

4. 删除变量

        unset username    删除变量username

5. 正确地定义数组

    arr=("小旺财" "小猫猫" "小丫丫")

    echo ${arr[1]}              查看下标为1的内容

    echo ${arr[*]}               查看数组所有内容

6. 将局部环境变量提升为全局

        export username               提升变量范围 (局部提升为全局)

7. 正确选择引号

    (1)不加引号、单引号、双引号对纯字符串无影响,有空格要用引号

        dog=金毛

        dog='金毛'

        dog="金毛"

        echo $dog         输出金毛

(2)单引号双引号区别:

        ⼀对单引号内的字符串将始终被解释为它的本身。

        yy='$dog 是一个小狗狗'      不解析$     显示$dog

        yy="$dog 是一个小狗狗"      对$解析     显示金毛

(3)反引号

    kk=`ls`  或  kk=$(ls)      将命令的结果保存到变量中

    echo $kk

8. 特殊变量名

    vim demo2.sh       echo $0   echo$1  echo $2      

    sh demo2.sh a b c      传参a、b、c          显示demo2.sh  a  b

$n:n为数字(0为脚本名称,1-9参数)

$#:获取所有输⼊参数个数,常⽤于循环。

$*:这个变量代表命令⾏中所有的参数,$*把所有的参数看成⼀个整体。

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

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

  echo $#   (获取所有输⼊参数个数)

  echo $?   查看上一次命令或者脚本的执行状态的结果,如果是0,表示正确,如果是非0,表示错误

三、运算符

1. 算术运算符

echo $((3+2))   或   echo $[10+20]

expr 3 + 2      加空格

\*              乘法用转义字符\

expr 3 \* 2

2. 逻辑运算符

  格式:[ 条件 ]

  注意[] ⾥⾯前后必须要有空格

  (1)字符串比较

    [ 9 -lt 10 ]      9<10

    echo $?         显示0,正确

    -lt ⼩于(less than) -le ⼩于等于(less equal)

    -eq 等于(equal)    -gt ⼤于(greater than)

    -ge ⼤于等于(greater equal) -ne 不等于(Not equal)

 

  (2)文件权限判断

  [ -r demo1.sh ]      验证demo1.sh有没有读权限

  echo $?              显示0,有读权限

  [ -x demo1.sh ]      验证demo1.sh有没有执行权限

  (3)多条件判断

  [ 9 -lt 10 ] && echo 对       正确会输出对

  [ 9 -gt 10 ] && echo 对       错误不会输出对

3. 常用的特殊字符串

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

  grep "^root" /etc/passwd

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

  grep "bash$" /etc/passwd

  (3).匹配⼀个任意字符

  grep "r..t" /etc/passwd

  (4)*不单独使⽤,他和上⼀个字符连⽤,表示匹配上⼀个字符0次或多次

   grep "r*" /etc/passwd

4. 正则表达式

        正则表达式通常被⽤来检索、 替换那些符合某个模式的⽂本。

        echo "t1234567" | grep "[0-9]"               1234567标红

        echo "t123p1234567" | grep "[0-9][3,6]"      23  23   56  标红

        echo '123$456$789' | grep "$"      

    echo '123$456$789' | grep "\$"          \表示转义

    echo '123$456$789' | grep "\\$"         找出所有包含‘$’的⾏

5. 扩展的正则表达式

        echo '1233333-45-6755668' | grep -E "[0-9]{2,3}"      0-9数字,出现2-3次标红(尽量满足多的)

四、条件选择、判断

1. if

age=$1if [ $age -le 16 ];thenecho "他还是个孩子"elseecho "他是个大人"fi
  if [ $1 -le 16 ];thenecho "他还是个孩子"elif  [ $1 -le 24 ] && [ $1 -gt 18 ];thenecho "他是个年轻人,不能太气盛"elseecho "他是个大人"fi

  sh demo3.sh 13          他还是个孩子

  sh demo3.sh 20          他是个年轻人,不能太气盛

  sh demo3.sh 26          他是个大人

  ctrl+q解锁

2. case

  case $1 in"上午")echo "火锅"echo "烤肉";;"中午")echo "三碗扯面"echo "六个纯瘦夹馍";;"晚上")echo "燕窝莲子羹"echo "牛奶";;*)echo "把时间填好"esac

  sh demo4.sh 上午                  火锅   烤肉

  sh demo4.sh 中午                  三碗扯面   六个纯瘦夹馍

  sh demo4.sh 晚上                  燕窝莲子羹   牛奶

  sh demo4.sh 白天                  把时间填好 (默认)

  注意事项

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

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

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

3. 循环

3.1 for
  s=0for((i=0; i<=100;i++))dos=$[$s+$i]doneecho $s

  sh demo05.sh                       输出5050

  do相当于{ , done相当于}

  for j in $*doecho $jdonefor j in $@doecho $jdone

  sh demo6.sh aa bb cc               输出 aa bb cc  aa bb cc

  # $@ 最终会被""解析为一个数组,每个元素都是传入的参数

for j in "$@"doecho $jdone

# $* 最终会被""解析为一个连续的字符串,只有一个元素

for j in "$*"doecho $jdone

  sh demo6.sh aa bb cc               输出 aa bb cc  aa、bb、cc

3.2 while循环
  num=$1s=0while [ $num -ge 0 ]dos=$[$num+$s]num=$[$num-1]doneecho $s
3.3 until 

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

  num=$1s=0until [ $num -eq 0 ]dos=$[$num+$s]num=$[$num-1]doneecho $s
3.4 select循环与菜单
PS3="请输⼊你要选择的序号: "select menu in ⽶饭 扯⾯ 包⼦ 稀饭 退出docase $REPLY in1|4)                               #米饭或稀饭secho "$menu 价格是 15";;2|3)                               #扯面或包子echo "$menu 价格是 20";;5)                                 #break;;*)                                 #默认echo "请你好好选"esacdone

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

        

五、read 读取控制台输

  read(选项)(参数)

  选项:

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

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

  read -p "请输入第一个数" num1

  read -p "请输入第二个数" num2

  echo "$num1 加上 $num2 的结果是 $[$num1+$num2]"

  read -t 10 -p "请输入第一个数" num1         #10秒钟输入第一个数

  read -t 10 -p "请输入第二个数" num2

  echo "$num1 加上 $num2 的结果是 $[$num1+$num2]"

六、⾃定义函数

  function func1(){read -p "请输入第一个数" num1read -p "请输入第二个数" num2echo "$num1 加上 $num2 的结果是 $[$num1+$num2]"}func1     #调用

七、练习

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

function func1(){read -p "请输入一个数" num1is_prime=truefor ((i=2; i*i<=$num1; i++))    #sprt(num1)doif [ $(($num1%i)) -eq 0 ]; thenis_prime=falsebreakfidoneif [ $is_prime = true ]; thenecho "$num1 是质数"elseecho "$num1 不是质数"fi}func1
#!/bin/bashfunction func1(){read -p "请输入一个数" num1is_prime=truefor ((i=2; i*i<=$num1; i++))doif [ $(($num1%i)) -eq 0 ]; thenis_prime=falsebreakfidoneif [ $is_prime = true ]; thenecho "$num1 是质数"elseecho "$num1 不是质数"fi}while true; doecho "请选择操作:"echo "1. 检查一个数是否为质数"echo "2. 退出程序"read -p "请输入选项编号:" choicecase $choice in1)func1;;2)echo "退出程序"exit 0;;*)echo "无效的选项,请重新选择。";;esacdone

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

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

相关文章

python 开发中识别和解决内存泄漏的技巧

Python 的内存管理是非常优秀的&#xff0c;它使用了自动垃圾回收机制。然而&#xff0c;在某些情况下&#xff0c;内存泄漏依然可能发生。这通常是在复杂的对象引用和循环引用的情境下容易出现&#xff0c;特别是涉及全局变量或不当的引用管理时。内存泄漏问题虽然并不常见&am…

Linux线程(二)线程ID及创建线程详解

1.线程ID 就像每个进程都有一个进程 ID 一样&#xff0c;每个线程也有其对应的标识&#xff0c;称为线程 ID。进程 ID 在整个系统中是唯一的&#xff0c;但线程 ID 不同&#xff0c;线程 ID 只有在它所属的进程上下文中才有意义。 进程 ID 使用 pid_t 数据类型来表示&#xf…

记录cocoscreater3.8.x设置2d卡牌圆角

引擎版本&#xff1a;Cocos Creater3.8.3版本 1.在Card节点上添加Mask组件&#xff0c;类型选择 2.在Card节点上绑定CardController.ts脚本 3.在CardController.ts编写圆角脚本&#xff0c;其实就是动态绘制Graphics组件 import { _decorator, Color, Component, Graphics, …

排序01 多目标模型

引入 使用机器学习方法对指标做预估&#xff0c;再对预估分数做融合。融合方法&#xff1a;加权和方法给不同指标赋予不同的权重&#xff0c;权重是做A/B test调试得到的。还有更好地融合方法。 多目标模型 排序模型的输入是各种各样的特征&#xff0c;用户特征主要是用户id和…

ADRC与INDI的关系

ADRC与INDI的关系 前言 一直热衷于把一些基础的东西想明白&#xff0c;这样才能更好地理解一些稍微复杂些的算法&#xff0c;在深入理解这些算法后才能更好地应用。 例如 用回路成型方法探究ADRC各参数对闭环系统的影响对比KF和RLS的关系互补滤波的原理以及参数整定&#xf…

【Python报错已解决】TypeError: not enough arguments for format string

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

C++【类和对象】(再探构造函数、类型转换与static成员)

文章目录 1. 再探构造函数2. 类型转换3. static成员结语 1. 再探构造函数 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有⼀种方式&#xff0c;就是初始化列表&#xff0c;初始化列表的使用方式是以⼀个冒号开始&#…

体系结构论文(五十三):Featherweight Soft Error Resilience for GPUs 【22‘ MIRCO】

Featherweight Soft Error Resilience for GPUs 一、文章介绍 背景&#xff1a;软错误通常由高能粒子&#xff08;如宇宙射线和α粒子&#xff09;打击电路造成的位翻转&#xff0c;可能导致程序崩溃或产生错误输出。随着电子技术的进步&#xff0c;电路对这种辐射引发的软错…

电子连接器温升仿真教程 二

在《电子连接器温升仿真教程 一》中详细介绍了用内热法做电子连接器温升仿真的操作步骤与方法,本教程将讲解用电流电压法做电子连接器温升仿真。 本教程,将以下面产品为例演示温升仿真方法其操作步骤。 该连接器为电池连接器,其Housing材料为LCP+30%GF,端子材质为铍铜…

Linux相关概念和重要知识点(11)(进程调度、Linux内核链表)

1.Linux调度算法 上篇文章我粗略讲过queue[140]的结构&#xff0c;根据哈希表&#xff0c;我们可以将40个不同优先级的进程借助哈希桶链入queue[140]中。调度器会根据queue的下标来进行调度。但这个具体的调度过程是怎样的呢&#xff1f;以及runqueue和queue[140]的关系是什么…

[C++] 剖析AVL树功能的实现原理

文章目录 引言AVL树的关键性质为什么选择AVL树&#xff1f; AVL树的结构节点对象的类 AVL树的插入检查是否为空树并处理根节点查询插入位置&#xff08;非递归&#xff09;插入节点并连接父节点更新平衡因子&#xff08;在失去平衡的条件下进行旋转&#xff09; 旋转旋转的原则…

基于ssm的学生社团管理系统 社团分配系统 社团活动调度平台 学生社团管理 信息化社团管理开发项目 社团活动管理 社团预约系统(源码+文档+定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

VMware中Ubuntu系统Docker正常运行但网络不通(已解决)

问题描述&#xff1a;在VMware中的Ubuntu系统下部署了Docker&#xff0c;当在docker容器中运行Eureka微服务时&#xff0c;发现Eureka启动正常&#xff0c;但无法通过网页访问该容器中Eureka。 解决办法如下&#xff1a; 1、创建桥接网络&#xff1a;test-net sudo docker n…

一文带你入门客制化键盘,打造专属打字利器

我用过不少键盘&#xff0c;但是都不太符合自己的需求&#xff0c;最后还是走向了客制化。 客制化&#xff0c;可以理解为自定义、DIY&#xff0c;自己动手拼装出一把只属于自己的键盘。 本文会对客制化做个简单的介绍&#xff0c;旨在读者能自己简单拼装出一款键盘。 目前市…

QStyle文档

前言 本文翻译自Qt官方文档&#xff0c;详细介绍了各成员/类型的作用&#xff0c;包含部分示例代码。 QStyle类的内容非常庞大&#xff0c;如需快速了解类成员和使用简介&#xff0c;请参见 QStyle简介。 一、QStyle Class QStyle是一个抽象基类&#xff0c;封装了GUI的外观…

OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离

OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离 —— 2024-10-02 下午 code review! 文章目录 OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离1.代码图片2.分析3.UML4.代码 1.代码图片 运行 Mouse button 1 pressed at (100, 200) Mouse dragged by (50, 50)…

Spring(学习笔记)

<context:annotation-config/>是 Spring 配置文件中的一个标签&#xff0c;用于开启注解配置功能。这个标签可以让 Spring 容器识别并处理使用注解定义的 bean。例如&#xff0c;可以使用 Autowired 注解自动装配 bean&#xff0c;或者使用 Component 注解将类标记为 bea…

10/02赛后总结

T1学习除法 题目传送门&#xff1a;学习除法http://bbcoj.cn/contest/1028/problem/1 说白了&#xff0c;就是检验是不是质数罢了&#xff0c;是质数输出0&#xff0c;不然输出1&#xff1b; 但是质数判断写错了 100分只有60分&#xff0c;damn #include<bits/stdc.h>…

【Linux】进程间关系与守护进程

超出能力之外的事&#xff0c; 如果永远不去做&#xff0c; 那你就永远无法进步。 --- 乌龟大师 《功夫熊猫》--- 进程间关系与守护进程 1 进程组2 会话3 控制终端4 作业控制5 守护进程 1 进程组 之前我们提到了进程的概念&#xff0c; 其实每一个进程除了有一个进程 ID(P…