【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=$1

  if [ $age -le 16 ];then

        echo "他还是个孩子"

  else

        echo "他是个大人"

  fi
  if [ $1 -le 16 ];then

        echo "他还是个孩子"

  elif  [ $1 -le 24 ] && [ $1 -gt 18 ];then

        echo "他是个年轻人,不能太气盛"

  else

        echo "他是个大人"

  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=0

  for((i=0; i<=100;i++))

  do

        s=$[$s+$i]

  done

  echo $s

  sh demo05.sh                       输出5050

  do相当于{ , done相当于}

  for j in $*

  do

        echo $j

  done

  for j in $@

  do

        echo $j

  done

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

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

for j in "$@"

do

        echo $j

done

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

for j in "$*"

do

        echo $j

done

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

3.2 while循环
  num=$1

  s=0

  while [ $num -ge 0 ]

  do

        s=$[$num+$s]

        num=$[$num-1]



  done

  echo $s
3.3 until 

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

  num=$1

  s=0

  until [ $num -eq 0 ]

  do

        s=$[$num+$s]

        num=$[$num-1]



  done

  echo $s
3.4 select循环与菜单
PS3="请输⼊你要选择的序号: "

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

do

case $REPLY in

1|4)                               #米饭或稀饭s

echo "$menu 价格是 15"

;;

2|3)                               #扯面或包子

echo "$menu 价格是 20"

;;

5)                                 #

break

;;

*)                                 #默认

echo "请你好好选"

esac

done

        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 "请输入第一个数" num1

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

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



  }

  func1     #调用

七、练习

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

function func1()

{

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

  is_prime=true

  for ((i=2; i*i<=$num1; i++))    #sprt(num1)

  do

    if [ $(($num1%i)) -eq 0 ]; then

        is_prime=false

        break

    fi

  done

  if [ $is_prime = true ]; then

    echo "$num1 是质数"

  else

    echo "$num1 不是质数"

  fi

}

func1
#!/bin/bash

function func1()

{

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

  is_prime=true

  for ((i=2; i*i<=$num1; i++))

  do

    if [ $(($num1%i)) -eq 0 ]; then

        is_prime=false

        break

    fi

  done



  if [ $is_prime = true ]; then

    echo "$num1 是质数"

  else

    echo "$num1 不是质数"

  fi

}



while true; do

  echo "请选择操作:"

  echo "1. 检查一个数是否为质数"

  echo "2. 退出程序"

  read -p "请输入选项编号:" choice



  case $choice in

    1)

      func1

      ;;

    2)

      echo "退出程序"

      exit 0

      ;;

    *)

      echo "无效的选项,请重新选择。"

      ;;

  esac

done

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT实现QMessageBox中文按钮

这是我记录Qt学习过程心得文章的第二篇&#xff0c;主要是为了方便QMessageBox弹出框的使用&#xff0c;通过自定义的方式&#xff0c;将其常用的功能&#xff0c;统一封装成一个函数&#xff0c;还是写在了Skysonya类里面。 实现代码&#xff1a; //中文提示对话框 bool Sky…

Python爬虫使用示例-古诗词摘录

一、分析需求 目标地址&#xff1a; https://www.sou-yun.cn/Query.aspx?typepoem&id二、提取诗句 import os import re import requests import parsel#url https://www.sou-yun.cn/PoemIndex.aspx?dynastyTang&author14976&typeJie urlhttps://www.sou-yun.…

【PGCCC】在 Postgres 上构建图像搜索引擎

我最近看到的最有趣的电子商务功能之一是能够搜索与我手机上的图片相似的产品。例如&#xff0c;我可以拍一双鞋或其他产品的照片&#xff0c;然后搜索产品目录以查找类似商品。使用这样的功能可以是一个相当简单的项目&#xff0c;只要有合适的工具。如果我们可以将问题定义为…

apisix云原生网关

定义 企业级网关通过域名、路由将请求分发到对应的应用上&#xff0c;通常承载数千个服务的流量&#xff0c;对稳定性有较高要求。 CNCF全景图 选型 Kubernetes抽象出两个核心概念&#xff1a;Service&#xff0c;为多个Pod提供统一的访问入口&#xff1b;Ingress&#xff…

汽车车轮平衡块行业前景:预计2030年全球市场规模将达到10亿美元

汽车车轮平衡块&#xff0c;也称为轮胎平衡块&#xff0c;是一种安装在车轮上的配重部件。它的主要作用是帮助车轮在高速旋转状态下保持动平衡。当车轮高速旋转时&#xff0c;由于车轮的动态不平衡状态&#xff0c;会导致车辆在行驶中出现车轮抖动和方向盘震动的现象。汽车车轮…

VSOMEIP代码阅读整理(1) - 网卡状态监听

一. 概述 在routing进程所使用的配置文件中&#xff0c;存在如下配置项目&#xff1a;{"unicast" : "192.168.56.101",..."service-discovery" :{"enable" : "true","multicast" : "224.244.224.245",…

【数据结构】栈和队列 + 经典算法题

目录 前言 一、栈 二、栈的实现 三、栈的循环遍历演示 四、栈的算法题 // 一、队列 二、队列的实现 三、使用演示 四、队列的算法题 总结 前言 本文完整实现了栈和队列的数据结构&#xff0c;以及栈和队列的一些经典算法题&#xff0c;让我们更加清楚了解这两种数据…

昇思MindSpore进阶教程--数据处理性能优化(中)

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 shuffle性能优化 shuffle操作主要是对有…

PCB缺陷检测数据集 xml 可转yolo格式 ,共10688张图片

PCB缺陷检测数据集&#xff08;yolov5,v7,v8&#xff09; 数据集总共有两个文件夹&#xff0c;一个是pcb整体标注&#xff0c;一个是pcb部分截图。 整体标注有6个分类&#xff0c;开路&#xff0c;短路等都已经标注&#xff0c;标注格式为xml&#xff0c;每个文件夹下有100多张…

vue3 环境配置vue-i8n国际化

一.依赖和插件的安装 主要是vue-i18n和 vscode的自动化插件i18n Ally https://vue-i18n.intlify.dev/ npm install vue-i18n10 pnpm add vue-i18n10 yarn add vue-i18n10 vscode在应用商城中搜索i18n Ally&#xff1a;如图 二.实操 安装完以后在对应项目中的跟package.jso…

探索Python的工业通信之光:pymodbus的奇妙之旅

文章目录 探索Python的工业通信之光&#xff1a;pymodbus的奇妙之旅背景&#xff1a;为何选择pymodbus&#xff1f;pymodbus是什么&#xff1f;如何安装pymodbus&#xff1f;5个简单的库函数使用方法3个场景使用示例常见bug及解决方案总结 探索Python的工业通信之光&#xff1a…

排序|插入排序|希尔排序|直接选择排序|堆排序的实现即特性(C)

插入排序 基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 单趟 当插入第 i ( i ≤ 1…

共享单车轨迹数据分析:以厦门市共享单车数据为例(十)

副标题&#xff1a;共享单车与地铁站出入口分布情况探究——以厦门市为例 假期结束了&#xff0c;我们满血复活&#xff0c;继续更新&#xff01; 本篇文章我们讨论共享单车与地铁出入口的关系&#xff0c;在上一篇文章中&#xff0c;我们讨论了综合得分指数最高的地铁站——…

Windows系统安装Docker

文章参考&#xff1a;Windows 安装docker&#xff08;详细图解&#xff09;-CSDN博客 安装包下载&#xff1a; 安装wsl的官方文档&#xff1a;安装 WSL | Microsoft Learn 查看windows相关配置 打开 (CTRLALTDELETE) 任务管理器 -> 选择性能 -> CPU ->虚拟化&#…

【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空

【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空 修改表添加字段语法示例注意事项 删除字段语法示例 修改字段使用 MODIFY COLUMN语法示例 使用 CHANGE COLUMN语法示例 重命名表语法示例 删除表语法示例 清空表使用 TRUNCATE TABLE使用 DELETE FROM对比 TRUNC…

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优

处理Java内存溢出问题&#xff08;java.lang.OutOfMemoryError&#xff09;&#xff1a;增加JVM堆内存与调优 在进行压力测试时&#xff0c;遇到java.lang.OutOfMemoryError: Java heap space错误或者nginx报错no live upstreams while connecting to upstream通常意味着应用的…

Unity MVC框架演示 1-1 理论分析

本文仅作学习笔记分享与交流&#xff0c;不做任何商业用途&#xff0c;该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了&#xff0c;老生常谈&#xff0c;网上有大量的介绍&#xff0c;想看看这三层都起到什么职责&#xff1f;那就直接上图吧 2.我举一个栗子 我有…

OpenSource - License 开源项目 TrueLicense

文章目录 官网集成Demo 官网 https://truelicense.namespace.global/ https://github.com/christian-schlichtherle/truelicense 集成Demo https://github.com/christian-schlichtherle/truelicense-maven-archetype https://github.com/zifangsky/LicenseDemo https://git…

机器学习——多模态学习

多模态学习&#xff1a;机器学习领域的新视野 引言 多模态学习&#xff08;Multimodal Learning&#xff09;是机器学习中的一个前沿领域&#xff0c;它涉及处理和整合来自多个数据模式&#xff08;如图像、文本、音频等&#xff09;的信息。随着深度学习的蓬勃发展&#xff0…

2020年华为杯数学建模竞赛D题论文和代码

无人机集群协同对抗 摘 要&#xff1a; 本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题&#xff0c;结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法&#xff0c;构建了无人机集群协同对抗推演模型。 针对问题一&#…