【Linux---07】Shell脚本

news2024/11/16 3:28:33

文章目录

  • 1. 前置说明
    • 1.1 创建shell脚本
    • 1.2 执行shell脚本
    • 1.3 调试shell脚本
    • 1.4 字符冲突
  • 2. 变量
    • 2.1 创建&使用变量
    • 2.2 位置变量
    • 2.3 引号规则
    • 2.4 数值变量运算
  • 3. 数组
    • 3.1 创建数组
    • 3.2 使用数组
  • 4. 运算符
    • 4.1 比较运算符
      • 4.1.1 数字比较
      • 4.1.2 字符串比较
    • 4.2 逻辑运算符
    • 4.3 文件运算符
  • 5. 控制语句
    • 5.1 分支语句
      • 5.1.1 if分支
      • 5.1.2 模式匹配
    • 5.2 循环语句
      • 5.2.1 for循环
      • 5.2.2 while循环
  • 6. 函数定义
    • 6.1 没有返回值的函数
    • 6. 有返回值的函数

1. 前置说明

shell脚本是linux系统中的一个可执行文件,它可以用来批量执行linux命令,比手动输入大量命令要高。

1.1 创建shell脚本

创建shell脚本有几个必须点:

  1. 文件必须以.sh结尾

  2. 文件的开头必须加上#! /biin/bash,指明脚本解释器

    cd ~
    vim myshell.sh
    

    在这里插入图片描述

1.2 执行shell脚本

shell脚本的执行:

  1. 方式一:使用sh命令

    sh myshell.sh
    
  2. 方式二:授予文件可执行权限,这样可以直接输入文件名运行文件

    # chmod a+x myshell.sh
    chmod +x myshell.sh   # 为当前用户增加对该文件权限
    myshell.sh
    

    在这里插入图片描述

1.3 调试shell脚本

在执行脚本前面加上-x

  1. sh -x myshell.sh (未授权)
  2. -x myshell.sh (已授权)
    在这里插入图片描述

1.4 字符冲突

通过下面可以知道$字符可以用来获取变量值,但是当我们要打印$符号怎么办?
使用\转义。其他字符冲突也是这样处理。

#! /bin/bash
money=100
echo "我有\$${money}元"  # 输出:我有$100元

2. 变量

2.1 创建&使用变量

  1. 创建变量:和Java一样,=左边是变量名,右边是变量值。

    注意事项:

    1. 变量名首字符必须为字母,名字只能用字母、数字、下滑线,不要用bash关键字。非法的名字:8var、var-8
    2. 变量名=值,等号两边不能有空格。
    3. 值只有字符串类型,值可以用单引号、可以用双引号,也可以都不用。但是值中有空格或特殊字符必须需要用双引号或单引号引起来。
    #! /bin/bash
    name="zhansgan"
    age=18
    echo $name  # 输出:zhangsan
    echo "${name}目前${age}岁!"  # 输出:zhangsan目前18岁!
    
  2. 使用变量:$变量名${变量名} 形式获取变量值。一般首先使用$变量名,当存在歧义没有达到理想效果时使用${变量名}方式,获取数组值必须用后者。

2.2 位置变量

如果要想向shell脚本里传入参数,可以在运行shell脚本时携带参数。在shell脚本内可以通过一些符号获取传递的值:

  1. $0:脚本的名称

  2. $1:脚本的第一个参数,$2是第二个参数,以此类推

  3. $#:传入脚本的参数个数

  4. $*:传入的所有参数拼接为一个字符串后返回

    #! /bin/bash
    # 判断当前目录下的所有文件,哪些是文件,哪些不是文件 
    arr=(`ls ./`)
    for file in ${arr[*]}
    do
    	if [ -f file ];then
    		echo "$file is a file"
    	else
    		echo "$file is not a file"
    	if
    dome
    
  5. $@:传入的每个参数是一个字符串

  6. $?:上一条命令的执行结果,0表示执行成功,非0表示执行失败

  7. $$:当前进程的id

比如:有 a.sh 脚本,内容如下

#! /bin/bash

echo $0
echo $1
echo $2
echo $#
echo $*
echo $@
echo $?

在这里插入图片描述

2.3 引号规则

  1. 单引号:里面的所有字符都是普通字符,不能够获取变量值。
  2. 双引号:会保留变量特性。可以使用$变量名获取变量值。
    #! /bin/bash
    name="zhansan"
    echo '$name'   # 输出:$name
    echo "$name"   # 输出:zhangsan
    
  3. 倒引号:引起来的命令将会被执行,执行后的结果作为这个表达式的值
    在这里插入图片描述

2.4 数值变量运算

  1. 语法:((数值运算)),加上$可取运算后的值$((数值运算))。支持的运算有 加减乘除取模自加 相等不等<<=运算
#! /bin/bash
a=10
b=20
echo "$((a+b))"  # 输出:30
echo "$((a%2))"  # 删除:0
echo "$((a++))"  # 输出:10,此时a=11
echo "$((++a))"  # 输出:11,此时a=11
echo "$((a!=2))"  # 输出:11,此时a=11
echo "$((a==2))"  # 输出:11,此时a=11
echo "$((a<=2))"  # 输出:11,此时a=11
echo "$((a<2))"  # 输出:11,此时a=11

3. 数组

3.1 创建数组

  1. 方式一:直接定义并初始化。
    #! /bin/bash
    arr=("aaa" "bbb" "ccc")
    

    注意:元素间使用空格,而不是逗号分隔;并且后续可以继续添加元素,并不是静态的。

  2. 方式二:使用declare -a
    #! /bin/bash
    # 1. 定义并初始化
    declare -a arr=("aaa" "bbb" "ccc")
    
    # 2. 先定义,再赋值
    declare -a arr
    arr[0]="aaa"
    arr[1]="bbb"
    arr[2]="ccc"
    

3.2 使用数组

  1. 获取数组长度:${#数组名[@|*]} eg:${#arr[*]}

  2. 读取数组元素

    1. 读取一个元素:${数组名[下标]}
    2. 一次读取所有元素:${数组名[*]}
  3. 给数组元素赋值:数组名[下标]=值

  4. 删除数组元素:unset 数组名[下标]

    [root@localhost shell]# arr1=("a1" "b1" "c1")
    [root@localhost shell]# echo ${arr1[*]}
    a1 b1 c1
    [root@localhost shell]# declare -a arr2=("a2" "b2" "c2")
    [root@localhost shell]# echo ${arr2[*]}
    a2 b2 c2
    [root@localhost shell]# declare -a arr3
    [root@localhost shell]# arr3[0]="a3"
    [root@localhost shell]# arr3[1]="b3"
    [root@localhost shell]# arr3[2]="c3"
    [root@localhost shell]# echo ${arr3[*]}
    a3 b3 c3
    [root@localhost shell]# 
    # 查看数组长度
    [root@localhost shell]# echo ${#arr3[*]}
    3
    # 获取数组第一个元素
    [root@localhost shell]# echo ${arr3[0]}
    a3
    # 删除数组第一个元素,数组长度-1
    [root@localhost shell]# unset arr3[0]
    [root@localhost shell]# echo ${#arr3[*]}
    2
    [root@localhost shell]# echo ${arr3[*]}
    b3 c3
    

4. 运算符

4.1 比较运算符

4.1.1 数字比较

语法:[ 数字 运算符 数字 ] 注意:整体前后空格,运算符前后空格

注意:前后都要有空格
在这里插入图片描述

[root@localhost shell]# [ 1 -eq 1 ] && echo 'ok'
ok
[root@localhost shell]# [ 1 -lt 0 ] && echo 'ok'   
[root@localhost shell]# [ 1 -lt 2 ] && echo 'ok' 
ok
# 没有空格隔开,报错
[root@localhost shell]# [ 1 -lt 2] && echo 'ok' 
-bash: [: 缺少 ]
# 变量替换也可以
[root@localhost shell]# a=1
[root@localhost shell]# [ $a -lt 2 ] && echo 'ok' 
ok
[root@localhost shell]# 

4.1.2 字符串比较

语法:[ 字符串 运算符 字符串 ] 注意:整体前后空格,运算符前后空格
在这里插入图片描述

[root@localhost shell]# [ "aaa" == "aaa" ] && echo 'ok'
ok
[root@localhost shell]# 
[root@localhost shell]# [ "aaa" != "bbb" ] && echo 'ok'    
ok
# 字符串判空
[root@localhost shell]# s=aaa
# 字符串非空
[root@localhost shell]# [ "${s}x" == "x" ] && echo 'ok'         
[root@localhost shell]# 
# 字符串为空
[root@localhost shell]# s=""
[root@localhost shell]# [ "${s}x" == "x" ] && echo 'ok'
ok

4.2 逻辑运算符

语法:[ 表达式 运算符 表达式 ] 注意:整体前后空格,运算符前后空格
在这里插入图片描述

[root@localhost shell]# [ ! 2 -lt 1 ] && echo 'ok' 
ok
[root@localhost shell]# [ 1 -eq 1 -o 1 -eq 2 ] && echo 'ok' 
ok
[root@localhost shell]# [ 1 -eq 1 -a 2 -eq 2 ] && echo 'ok'   
ok
[root@localhost shell]# [ 1 -eq 1 -a 2 -ne 2 ] && echo 'ok'  
[root@localhost shell]# [ 1 -ne 1 ] || echo 'ok'
ok

细节:&&有一个非常有用的作用—将多行命令变成一行,这对于平台化的shell脚本执行非常有帮助。通过平台执行shell脚本时,往往限制只能执行一行命令。比如:cd bin && sh run.sh $@
在这里插入图片描述

4.3 文件运算符

语法:[ 运算符 文件相对路径|绝对路径 ] 注意:整体前后空格,运算符前后空格
在这里插入图片描述

[root@localhost shell]# [ -e hello.sh ] && echo 'ok'        
ok
[root@localhost shell]# [ -f hello.sh ] && echo 'ok'
ok
[root@localhost shell]# [ -d hello.sh ] && echo 'ok'      
[root@localhost shell]# 

5. 控制语句

5.1 分支语句

5.1.1 if分支

# 方式一:表达式后面写分号,再写then
if  条件表达式一 ; then   
    表达式一true时执行这里
elif  条件判断式二 ; then    
    表达式二true时执行这里
elif  条件判断式三 ; then    
    表达式三true时执行这里
else    
    都不成立时,执行这里
fi

# 方式二:表达式后面写不写分号,则必须换行后写thenthen
if  条件表达式一 
	then 表达式一true时执行这里
elif  条件判断式二 
	then 表达式二true时执行这里
elif  条件判断式三
	then 表达式三true时执行这里
else    
    都不成立时,执行这里
fi

注意 :最后要以 if反过来的fi结尾

例子:

[root@localhost shell]# vim test.sh
#! /bin/bash
cmd=$1
if [ $cmd == "start" ]
	then echo "start"
elif [ $cmd == "stop" ]
	then echo "stop"
elif [ $cmd == "restart" ]
	then echo "restart"
else
	echo "other"
fi
[root@localhost shell]# sh test.sh 123   # 输出:other

5.1.2 模式匹配

case $var in
     模式1)  
             代码块1
             ;; 
     模式2)    
             代码块2    
             ;;    
     模式3)    
             代码块3   
             ;;    
        *)    
             代码块4    
             ;;
esac

注意 :最后要以 case反过来的esac结尾

例子:

[root@localhost shell]# vim s6.sh 
#! /bin/bash
cmd=$1
case $cmd in
        "start") echo "start operation"
                ;;
        "stop") echo "stop operation"
                ;;
        "restart") echo "restart operation"
                ;;
        *) echo "other operation"
                ;;
esac

5.2 循环语句

5.2.1 for循环

  1. 语法:

    # 方式一:和python一样
    for 循环变量 in 数据列表
    do
        循环体代码段
    done
    
    # 方式二:和jaava一样
    for((控制变量的初始化;循环的条件;循环控制变量的更新))
    do
         循环体代码段
    done
    
    1. 数据列表{1..100}:表示1到100
      #! /bin/bash
      for i in {1..10}
      do
        echo $i
      done
      # 打印1到10
      
    2. 结尾必须写上done
  2. 例子:

    #! /bin/bash
    # 判断当前目录下哪些文件是普通文件
    arr=(`ls ./`)
    # 遍历数组的每个元素(文档)
    for f in ${arr[*]}
    do
        # 判断是否是文件
        if [ -f $f ]; then
                echo "$f is file"
        fi
    done
    
  3. 例子3

    #! /bin/bash
    # 计算1-10内的偶数之和
    sum=0
    for((i=1;i<=10;i++))
    do
      if [ $((i%2)) -eq 0 ];then
        sum=$((sum+i))
      fi
    done
    echo "sum=${sum}"
    

5.2.2 while循环

  1. 语法:

    while((循环的条件))
    do
        循环体代码段
    done
    
  2. 例子

    #! /bin/bash
    i=1
    while((i<10))
    do
      ((i++))
    done
    echo "i=$i"  # 输出:i=10
    

6. 函数定义

6.1 没有返回值的函数

#!/bin/bash

fun(){
    echo "hello student!"
}

fun   # 输入方法名时,调用函数

6. 有返回值的函数

#!/bin/bash

num1=$1
num2=$2
funandReturn(){
    return $(($num1+$num2))
}

funandReturn  # 输入函数名,会调用函数
echo "输入的两个数字之和为 $? !" # 通过 $? 获取函数返回值

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

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

相关文章

国内首个可调用API的视频模型,CogVideoX有多能打?

近期&#xff0c;智谱AI在其Maas开放平台(bigmodel.cn)发布了视频生成大模型CogVideoX&#xff0c;它提供了国内首个通过API来使用的文生视频和图生视频服务&#xff01; 话不多说&#xff0c;我们直接来看一下通过CogVideoX生成的一部短片。 技术原理 CogVideoX融合了文本、…

CSP-J复赛-模拟题4

1.区间覆盖问题&#xff1a; 题目描述 给定一个长度为n的序列1,2,...,a1​,a2​,...,an​。你可以对该序列执行区间覆盖操作&#xff0c;即将区间[l,r]中的数字,1,...,al​,al1​,...,ar​全部修改成同一个数字。 现在有T次操作&#xff0c;每次操作由l,r,p,k四个值组成&am…

未授权访问漏洞系列详解⑦!

VNC未授权访问漏洞 VNC 是虚拟网络控制台 Virtual Network Console 的英文缩写。它是一款优秀的远程控制工具软件由美国电话电报公司AT&T的欧洲研究实验室开发。VNC是基于 UNXI和 Linux 的免费开源软件由 VNC Server 和 VNC Viewer 两部分组成。VNC 默认端口号为 5900、590…

opencascade AIS_TypeFilter AIS_XRTrackedDevice源码学习

opencascade AIS_TypeFilter 前言 通过它们的类型选择交互对象。该过滤器会对本地上下文中的每个交互对象提出问题&#xff0c; 以确定它是否具有非空的所有者&#xff0c;并且如果是&#xff0c;则检查它是否是所需类型。 如果对象在每种情况下都返回 true&#xff0c;则保留…

运动控制卡——固高GTS

文章目录 前言什么是运动控制卡指示灯状态检测主卡指示灯状态说明端子板指示灯状态说明 软件调试(P39)何将控制器配置成脉冲模式设置与定位 编程C#编程 一些概念 前言 在一些控制多轴电机运动的场景下&#xff0c;除了需要驱动器驱动该轴的电机外&#xff0c;还需要用到控制卡…

kickstart自动部署

目录 一 准备工作二 安装软件及其相关配置配置步骤&#xff0c;图形引导部署web服务配置dhcp部署pxe 三 使用新机验证 一 准备工作 主机采用rhel7.9版本 本文使用图形化界面就行操作设置 取消VMware dhcp设置 yum group install "Server with GUI" init 5 #启动图…

vue3中使用logicFlow

浅结logicFlow使用&#xff1a; 应用场景&#xff1a;vue3中使用logicFlow绘制流程图 技术碎片应用&#xff1a; vue3&#xff1a;ref,reactive, onMounted, watchEffect,nextTick,inject logicFlow&#xff1a;节点&#xff0c;边&#xff0c;锚点&#xff0c;事件 官网&#…

大模型微调fine-tuning

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl大模型微调概述 大模型fine-tuning(微调)是一种重要的机器学习技术,特别是在处理自然语言处理(NLP)任务时广泛应用。它指在已经预训练好的大型深度学习模型基础上,使用新的、特定任务相关的…

【文献阅读】GraphAny: A Foundation Model for Node Classification on Any Graph

Abstract 可以执行任何新任务而无需特定训练的基础模型已经在视觉和语言应用中引发了机器学习的革命。然而&#xff0c;涉及图结构数据的应用仍然是基础模型面临的一个难题&#xff0c;因为每个图都有独特的特征和标签空间。传统的图机器学习模型&#xff0c;如图神经网络&…

在Fragment中显示高德地图

一、首先在高德官网上申请key 第一步:按照规定填写Key名称第二步:选择服务平台,运用在android上就勾选anroid就好了第三步:输入发布版安全码SHA1 首先打开命令行按住windows+r两个按键在命令行中输入cd .android,定位到.android文件下调试版本使用 debug.keystore,命令为…

交通预测数据文件梳理:METR-LA

文章目录 前言一、adj_METR-LA.pkl文件读取子文件1读取子文件2读取子文件3 二、METR-LA.h5文件 前言 最近做的实验比较多&#xff0c;对于交通预测数据的各种文件和文件中的数据格式理解愈加混乱&#xff0c;因此打算重新做一遍梳理来加深实验数据集的理解&#xff0c;本文章作…

数位dp学习

参考借鉴&#xff1a; 数位DP学习整理&#xff08;数位DP看完这篇你就会了&#xff09;-CSDN博客 AcWing1081.度的数量(数位DP)题解_求给定区间$ [x,y]$ 中满足下列条件的整数个数:这个数恰好等于 k k k 个互不相等-CSDN博客 就是类似前缀和的思想&#xff0c;进行数字在位数…

最新资讯 | 开源大模型Llama会失去技术优势吗?

昨夜&#xff0c;Meta宣布推出迄今为止最强大的开源模型——Llama 3.1 405B&#xff0c;支持上下文长度为128K Tokens&#xff0c;在基于15万亿个Tokens、超1.6万个H100 GPU上进行训练&#xff0c;这也是Meta有史以来第一次以这种规模训练Llama模型。Meta同时还发布了全新升级的…

2024年,pdf文献热门翻译软件总结推荐

对于如今的时代&#xff0c;市面上存在各式各样的学术资料&#xff0c;对于没有语言天赋的我&#xff0c;看得眼花缭乱。看个学术资料都不知道要用哪个工具&#xff0c;试来试去和睦浪费时间。今天就我使用过的翻译软件中&#xff0c;整理了四款能帮助我们解决文献翻译难题的四…

未授权访问漏洞系列详解⑧!

Druid未授权访问漏洞 漏洞特征:http://www.xxxx.com/druid/index.html 当开发者配置不当时就可能造成未授权访问下面给出常见Druid未授权访问路径 ------------- /druid/websession.html /system/druid/websession.html /webpage/system/druid/websession.html(jeecg) ----…

GitHub惊天安全漏洞:删除的仓库竟能永远访问

引言 近日&#xff0c;GitHub 被曝出一个严重的安全漏洞&#xff0c;引发了广泛关注。开源安全软件公司 Truffle Security 的安全研究员 Joe Leon 发现&#xff0c;在 GitHub 上删除的代码仓库实际上仍然可以被访问。这一发现震惊了整个开源社区。本文将详细探讨这一安全漏洞的…

PXE服务器自助部署

kickstart部分 一、实验环境 两台主机&#xff1a;一台用于环境搭建&#xff08;ngnix.yee.org&#xff09;&#xff0c;一台用于测试(check_ks)。测试机 二、开启主机图形工具&#xff0c;并进行基本配置 查看 /root/anaconda-ks.cfg 文件&#xff0c;这个文件是系统安装以…

学习记录——day26 进程间的通信(IPC)无名管道 无名管道 信号通信 特殊的信号处理

目录 一、进程间通信引入 二、无名管道 1、无名管道相关概念 2、无名管道的API接口函数 pipe(int pipefd[2]); 3、管道通信的特点 4、管道的读写特点 三、无名管道 1、有名管道&#xff1a;有名字的管道文件&#xff0c;其他进程可以调用 2、可以用于亲缘进程间的通信&…

windows下,使用vs code远程连接云服务器【以CentOS7为例】

windows下&#xff0c;使用vs code远程连接云服务器 1. 下载VS code并准备相关插件2. 使用Remote - SSH远程控制Linux 1. 下载VS code并准备相关插件 1. VS code官网&#xff1a; 下载地址&#xff1a;https://code.visualstudio.com/Download下载合适版本的vs code。 2. 推荐…

20款奔驰S450升级原厂红外夜视系统,提升您夜晚行车安全

夜视辅助系统增强版不仅可以对处于潜在危险位置的行人进行探测&#xff0c;还可发现动物。当车辆进入没有路灯的区域&#xff0c;第三代夜视系统可自动将仪表盘的显示内容从车速表转变为锐度极高的夜视图像&#xff0c;并将探测到前方出现的行人或动物在系统中以鲜明的色彩突出…