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

news2024/10/6 23:07:56

目录

一、介绍

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.coloradmin.cn/o/2193134.html

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

相关文章

MES系统与其他系统的集成

一、MES与ERP的集成 1. 实时数据共享 万界星空科技MES系统可以与企业资源计划&#xff08;ERP&#xff09;系统集成&#xff0c;实现双向数据传输。通过实时数据共享&#xff0c;ERP系统能够更准确地进行物料需求计划&#xff0c;并及时更新生产进度和库存信息。 2. 工单管理…

LeetCode讲解篇之322. 零钱兑换

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们可以使用动态规划解决这道题&#xff0c;我们首先定义一个数组&#xff0c;数组中第i个元素表示组成金额 i 的最少硬币个数 我们遍历数组的1 ~ amount号位置&#xff0c;对coins进行遍历&#xff0c;查找选…

短剧小程序短剧APP在线追剧APP网剧推广分销微短剧小剧场小程序集师知识付费集师短剧小程序集师小剧场小程序集师在线追剧小程序源码

一、产品简介功能介绍 集师专属搭建您的独有短剧/追剧/小剧场小程序或APP平台 二、短剧软件私域运营解决方案 针对短剧类小程序的运营&#xff0c;以下提出10条具体的方案&#xff1a; 明确定位与目标用户&#xff1a; 对短剧类小程序进行明确定位&#xff0c;了解目标用户群体…

【最新华为OD机试E卷-支持在线评测】计算三叉搜索树的高度(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

社会工程学:社工无处不在

目录 社会工程学 社工利用了人的弱点 社会工程学攻击的流程通常可以分为以下几个步骤 以下是一些常见的方式&#xff0c;攻击者可以利用这些方式来收集个人信息 一些常见的攻击方式 钓鱼邮件 宏病毒 网站克隆 防范 社会工程学 介绍&#xff1a; 社会工程学是一种攻击技…

S7-200 SMART 与调试助手之间 Modbus RTU 通信

西门子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站/从站协议库&#xff0c;Modbus RTU 指令位于 STEP7-Micro/WIN SMART 项目树中“指令”文件夹的“库”文件夹中。如图1.Modbus RTU库指令所示。 图1.Modbus RTU库指令 注意&#xff1a; 1. Modbus RTU 主站指令库的…

nginx 负载均衡1

遇到的问题 大型网站都要面对庞大的用户量&#xff0c;高并发&#xff0c;海量数据等挑战。为了提升系统整体的性能&#xff0c;可以采用垂直扩展和水平扩展两种方式。 垂直扩展&#xff1a;在网站发展早期&#xff0c;可以从单机的角度通过增加硬件处理能力&#xff0c;比如 C…

【Redis】持久化(上)---RDB

文章目录 持久化的概念RDB手动触发自动触发bgsave命令的运行流程RDB文件的处理RDB的优缺点RDB效果展示 持久化的概念 Redis支持AOF和RDB两种持久化机制,持久化功能能有效的避免因进程退出而导致的数据丢失的问题,当下次重启的时候利用之前持久化的文件即可实现数据恢复. 所以此…

Alignment与Correspondence,用于量化衡量MLLM中视觉特征的视觉语义对齐与视觉结构程度的方法

Alignment与Correspondence&#xff0c;用于量化衡量MLLM中视觉特征的视觉语义对齐与视觉结构程度的方法 FesianXu 20241006 at Wechat Search Team 前言 在多模态大模型&#xff08;Multimodal Large Language Model&#xff0c; MLLM&#xff09;中&#xff0c;视觉特征就像…

MySQL 篇-深入了解存储引擎、索引(InnoDB 索引结构 B+Tree、索引使用规则)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 存储引擎概述 1.1 存储引擎 - InnoDB 1.2 存储引擎 - MyISAM 1.3 存储引擎 - Memory 1.4 存储引擎 - 选择 2.0 索引概述 2.1 索引结构 2.1.1 索引结构 - B-Tree 2…

Docker:安装 MongoDB 的详细指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 MongoDB 是一个流行的 NoSQL 数据库&#xff0c;可以在 Docker 容器中轻松安装和运行。本文将介绍如何在 Docker 中安装 MongoDB&#xff0c;并展示如何在 Java 应用中使用 MongoDB…

MySQL事务日志—redo日志介绍

MySQL事务日志—redo日志 事务有4种特性&#xff1a; 原子性、一致性、隔离性和持久性。 那么事务的四种特性到底是基于什么机制实现? 事务的原子性、一致性由事务的 undo 日志事务的隔离性由锁机制和MVCC实现。事务的持久性由redo 日志来保证。 两类日志概述&#xff1a;…

基于猎豹优化算法(The Cheetah Optimizer,CO)的多无人机协同三维路径规划(提供MATLAB代码)

一、猎豹优化算法 猎豹优化算法&#xff08;The Cheetah Optimizer&#xff0c;CO&#xff09;由MohammadAminAkbari等人于2022年提出&#xff0c;该算法性能高效&#xff0c;思路新颖。 参考文献&#xff1a; Akbari, M.A., Zare, M., Azizipanah-abarghooee, R. et al. The…

‌在Python中,print(f‘‘)是什么?

‌在Python中&#xff0c;print(f’)表示使用f-string对字符串进行格式化输出。‌ f-string是Python 3.6及以上版本引入的一种新的字符串格式化机制&#xff0c;它允许在字符串中直接嵌入表达式&#xff0c;这些表达式在运行时会被其值所替换。使用f-string可以更方便地将变量的…

【通信协议】一文学会异步、同步、串行、并行、单工、半双工、全双工(一)

通信方式详解&#xff1a;异步、同步、串行、并行、单工、半双工、全双工 引言一、通信方式分类概述二、串行通信与并行通信串行通信 (Serial Communication)并行通信 (Parallel Communication)串行与并行通信对比表 三、全双工、半双工、单工通信单工通信 (Simplex Communicat…

怎么将mp4转换为mp3?教你6种值得收藏的视频转音频方法!

怎么将mp4转换为mp3&#xff1f;自媒体生活如此繁华的现在&#xff0c;我们经常需要从视频中提取音频&#xff0c;以便在不同的设备或场合中播放&#xff0c;又或者提取视频中的音频进行二次视频/音频/故事创作&#xff0c;因此&#xff0c;将MP4视频文件转换为MP3音频文件变成…

了解奈奎斯特采样定律和频率混叠:数字信号处理中的关键概念

在数字信号处理和通信领域&#xff0c;采样是将连续信号转化为离散数字信号的关键步骤。采样的过程虽然看似简单&#xff0c;但其中蕴含着深刻的理论&#xff0c;直接关系到信号重建的准确性。而奈奎斯特采样定律和频率混叠就是其中两个非常重要的概念。本文将带您深入了解这两…

基金好书入门阅读笔记《基金作战笔记:从投基新手到配置高手的进阶之路》2

买基金&#xff0c;说到底是买基金所持有的一揽子资产。那么&#xff0c;常见的可投资产都有哪些类型呢&#xff1f; 图2.9进行了系统性的梳理&#xff0c;我们把资产分为四大类&#xff0c;分别是权益类、固收类、现金和另 类&#xff0c;下面就一一解读。 年化收益率是把一段…

L111213 【哈工大_操作系统】内核级线程内核级线程实现操作系统之“树”

L2.4 内核级线程 切换进程&#xff0c;实际上是切换内核级线程&#xff0c;没有用户级进程说法&#xff0c;进程只能在内核中。 多核与多处理器的区别在于是否共用资源。多核多线程 并发&#xff1a;同时触发&#xff0c;交替执行&#xff0c;在一个核上 并行&#xff1a;同…

《数字图像处理基础》学习01-数字图像处理的相关基础知识

这篇文章只是对数字图像处理的相关基础知识有个大概的了解&#xff0c;之后的文章会接着补充和扩展。 目录 一&#xff0c;图像的基本概念 1&#xff0c;图像 2&#xff0c;图像的分类 1&#xff09;物理图像 2&#xff09;虚拟图像 二&#xff0c;数字图像处理 三&…