学习笔记Day15:Shell脚本编程

Shell脚本编程

Linux系统环境

Linux系统的4个主要部分:内核、shell、文件系统和应用程序。

  • 内核是操作系统的核心,决定系统性能和稳定性
  • shell :一种应用程序,是用户和内核交互操作的接口,是套在内核外的壳,内核和用户之间的“翻译官”。
  • 系统环境命令:
    • 查看CPU信息:lscpu
      • Architecture 架构:x86_64
      • CPU(s):几核
    • 查看内存信息:free -h
    • 查看硬盘信息:df -h
      • /dev/vda1 Mounted on 指挂载在哪个目录
    • 查看文件大小:du -h -d 1 (只展开第一级目录)
      • conda clean -a 清空conda环境中下载的安装包、缓存等
    • 查看文件大小:du -sh ~ (看某个目录的总占大小)
    • 查看系统进程和命令
      • top 服务器运行情况 q/Ctrl+c退出
      • htop top的升级版,界面更友好,需要安装(conda-forge)。上方的框是线程数量,8个即8线程。支持鼠标操作。
      • jobs 查看后台正在运行的命令,只在当前窗口起效。

变量

环境变量、状态变量、位置参数变量、自定义变量,调用变量时,要在变量前面加$符号

自定义变量

自行定义的变量,可以用于用户编写的脚本,多个命令之间值的传递

a=gene              #=前后不要有空格
echo a
## a
echo $a            #调用变量要加$
## gene
  • 单引号中变量不解释,双引号中变量解释

    echo 'This is a $a'
    ## This is a $a
    echo "This is a $a"
    This is a gene
    
环境变量

用于储存有关shell会话和工作环境的系统变量

  1. $HOME :当前用户的主目录
  2. $PATH :shell查找命令的目录列表,由冒号(:)分隔
  3. $SHELL :bash shell的全路径名
  4. $LOGNAME :查看当前用户的登录名
  5. $PS1 :shell命令行界面的主提示符
状态变量

用于记录命令的运行结果

$? :获取上一个命令的执行状态返回值,执行成功返回0,执行不成功时根据情况显示不同数字。用于判断命令执行是否成功。

应用:

if [ $? -eq 0 ]
...
位置参数变量

用于向命令或程序脚本中传递信息

$n n为数字,$0代表命令本身, 1 − 9 代表第 1 − 9 个参数。 10 以上的参数需要用 包含,如 1-9代表第1-9个参数。10以上的参数需要用{}包含,如 19代表第19个参数。10以上的参数需要用包含,如{10}。

结构化语句

条件语句 if

模式:

if  command1
thencommands
elseif command2thencommandsfi
fi

常见条件:

  • 数值判断:

    在这里插入图片描述

    if [ 1 -eq 1 ]        #空格很重要!
    then
    echo "Hi!"
    else
    echo "???"
    fi
    
  • 字符串判断

    在这里插入图片描述

    应用:

    if [ -z $1 ]    ##如果第一个参数没有写(为0),则…(可以打印帮助文档等)
    then
    ....
    
  • 文件判断

    应用:

    if [ ! -f ok.txt ]   # 如果不存在这个文件,则创建一个
    then
    touch ok.txt
    fi
    
循环语句 for

模式:

for i in list
do commands
done

例:

for i in 1 2 3 4 5
do
echo ${i} "Hi!"
sleep 2s
done
  • i(变量)外面要加{},否则容易分辨不出变量

    a=gene
    echo $a1
    ##
    echo ${a}1
    ## gene1
    

list的常见格式:

  • list="CDS exon gene"   #空格分割
    for i in ${list}
    do 
    echo "This feature is ${i}"   #使用双引号,扩展变量
    done
    
  • 对文件进行操作

    ls file*
    ## file1 file2 file3
    for i in $(ls file*)    #等价于`ls file*`
    do
    mv ${i} ${i}.txt       #重命名
    done
    
循环语句 While

格式:

while  read id(变量)
do commands
done

例子:

ls file* | while read id(代指前面ls file*中的每一项)
do 
mv ${id} ${id}.txt
done
  • 参数扩展

    • 掐头去尾

    在这里插入图片描述

    例:(去尾用的较多)

id=example.test.fq   ##定义一个变量
echo ${id#e}         ##从头开始,删除第一个e
## xample.test.fq    
echo ${id##*e}    ##从头开始,删除最后一个e前面的内容
## st.fq
echo ${id%.*}    ##从后往前,删除第一个.后面的内容
## example.test
echo ${id%%.*}    ##从后往前,删除最后一个.后面的内容
  • 替换

在这里插入图片描述

例:

id=Data.tar.gz
echo ${id/ta/??}
##Da??.tar.gz
echo ${id//ta/??}
##Da??.t??.gz

脚本编辑

shell脚本:.sh为后缀的文件大多是脚本文件,可以用bash命令激活。 脚本文件不一定要以.sh结尾,内容决定文件格式。

例:

cat openFile.sh
## echo $0
## cat $1
bash openFile.sh readme.txt
## openFile.sh                   ##echo脚本名字
## README....                    ##打印第一个参数
  • 释伴(shebang)

    脚本文件第一行:#! /usr/bash(#!+bash路径)为脚本的释伴(shebang指定解释器),意为当该脚本作为命令执行时,使用哪个命令来解释这个脚本。在Linux中执行其他变成语言时,需要在释伴位置注释语言执行(Rscript/python等)。

    • shebang的通用写法

      #!/usr/bin/env bash
      #!/usr/bin/env python
      #!/usr/bin/env Rscript
      
  • shell脚本直接执行:修改shell脚本的文件权限后(可执行),可以直接通过路径调用。

  • 输出执行日志:1标准输出流,2标准误输出流。

    执行任务后将输出结果1保存到?中,将另一部分输出结果2(大多为错误,不绝对)保存到?中(?可设置)

    bash test.sh >out.log   #重定向,标准输出流到out.log文件,标准误到屏幕上
    bash test.sh 1>test.log 2>error.log  #分开重定向,正确与错误分别进入两个log文件
    bash test.sh 1>test.log 2>&1  #分开重定向,将2输出到1中,错误有上下文联系
    
  • 提交任务(后台)

    nohup结合&

    nohup bash file.sh &
    

    结果默认输出到nohup.log中

    htop 查看后台执行的任务

    tail -f 查看任务执行情况

    lessShift+F进入浮动模式查看任务执行情况

  • 中止后台任务

    • htop中找到需要停止的任务,点击Kill/按F9/输入9 SIGKILL

    • ps -ef       #给系统进程拍照
      ps -ef | grep 'pattern'  #搜索关于pattern的信息,找到目标任务和编号
      kill -9 PID    #命令杀任务
      
  • 重定向后台任务的输出文件,可以用于多个任务后台运行时,分清每个任务的输出文件

    nohup bash file.sh > file.log &
    # 输出一个任务编号
    tail -f file.log   #看任务执行情况
    
  • Tips:;&&均可以连接两个命令,;前后两个命令独立执行,&&在前命令执行成功条件下后命令才会执行

  • history保存了既往写过的命令,可以结合grep命令搜索写过的命令

推荐学习资料:Bash脚本入门https://wangdoc.com/bash/

引用自生信技

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 进阶教程 - 二次开发(制作您的文生图应用)

目录 1. 引言 2. 基于Rest API 开发 2.1 前置条件 2.2 代码实现 2.3 效果演示 2.4 常见错误 3. 总结 1. 引言 Stable Diffusion作为一种强大的文本到图像生成模型,已经在艺术、设计和创意领域引起了广泛的关注和应用。然而,对于许多开发者来说&#xff…

使用倒模耳机壳UV树脂胶液制作舞台监听耳返入耳式耳机壳推荐的材料和工艺流程?

推荐的材料和工艺流程如下: 材料: UV树脂胶液:选择适合倒模工艺的UV树脂胶液,要求具有高透明度、良好的流动性和固化性能。模具材料:建议使用硅胶模具,因为硅胶模具具有较高的耐用性和稳定性,…

Linux 安装 JDK、MySQL、Tomcat(图文并茂)

所需资料 下载 1.1 软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布,只要解压,修改配置即可rpm安装软件已经按照re…

C#自定义控件 生成 与 加入到项目

C#自定义控件生成 在C#中,自定义控件通常是通过继承现有的控件类(如UserControl、Form等)并添加或修改其属性和方法来实现的。以下是一个简单的示例,演示如何创建一个自定义控件: 首先,创建一个新的Window…

sonar+gitlab提交阻断 增量扫描

通过本文,您将可以学习到 sonarqube、git\gitlab、shell、sonar-scanner、sonarlint 一、前言 sonarqube 是一款开源的静态代码扫描工具。 实际生产应用中,sonarqube 如何落地,需要考虑以下四个维度: 1、规则的来源 现在规则的…

每日一练:LeeCode-200、岛屿数量【DFS递归+BFS队列】

给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边…

MyBatis:查询与连接池

一、查询 1、多表查询 尽量避免使用多表查询,尤其是对性能要求较高的项目。因为多表查询必然会导致性能变低。 例如:select *from ta运行需要10ms,select *from tb 运行也需要10s。但是,select *from ta left join tb on ta.xx…

python初级第一次作业

一、 dayint(input("enter today day")) fdayint(input("enter num of day since today")) c((fday%7)day)%7 if c0:print("sunday") elif c1:print("monday") elif c2:print("tuesday") elif c3:print("wendnsday&quo…

Jmeter脚本优化——CSV数据驱动文件

使用 CSV 数据文件设置实现参数化注册 1) 本地创建 csv 文件,并准备要使用的数据,这里要参数化的是注册的用户名和邮箱。所以在 csv 文件中输入多组用户名和邮箱。 2) 通过测试计划或者线程组的右键添加->配置元件->CSV…

多线程合并练习题,线程安全(售票任务引入)--学习JavaEE的day30

day30 练习(day29) 注意代码注释,里面涉及代码实现遇到问题及解决方案,由于理解方便没有单独出来 1.计算任务 1.计算任务,一个包含了2万个整数的数组,分拆了多个线程来进行并行计算,最后汇总出…

FT232RL/FT232RNL替代GP232RNL USB转UART桥接控制器芯片低成本方案

关注过小编的朋友都知道,之前小编有推荐过FT232RL的替代产品GP232RL,软硬件直接兼容,无需做修改。随着产品的更新迭代,后面也出来了升级版GP232RNL,低成本方案,可直接替代FT232RL/FT232RNL,参数…

【数据结构】线性表的定义与基本操作

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

阿里二面:谈谈ThreadLocal的内存泄漏问题?问麻了。。。。

引言 ThreadLocal在Java多线程编程中扮演着重要的角色,它提供了一种线程局部存储机制,允许每个线程拥有独立的变量副本,从而有效地避免了线程间的数据共享冲突。ThreadLocal的主要用途在于,当需要为每个线程维护一个独立的上下文…

linux之sed编辑器指令练习

目录 一、sed编辑器 二、sed使用案例 1.1 s命令(substitute替换) 一、sed编辑器 sed编辑器比交互式编辑器快的多,可以简化数据处理任务,sed编辑器并不会修改文件,只会将修改后的数据,输出。 二、sed使用案例 首先…

RK3568平台 iperf3测试网络性能

一.iperf3简介 iperf是一款开源的网络性能测试工具,主要用于测量TCP和UDP带宽性能。它可以在不同的操作系统上运行,包括Windows、Linux、macOS等。iperf具有简单易用、功能强大、高度可配置等特点,广泛应用于网络性能测试、网络故障诊断和网…

【编译tingsboard】出现gradle-maven-plugin:1.0.11:invoke (default)

出现的错误: [ERROR] Failed to execute goal org.thingsboard:gradle-maven-plugin:1.0.11:invoke (default) on project http: Execution default of goal org.thingsboard:gradle-maven-plugin:1.0.11:invoke failed: Plugin org.thingsboard:gradle-maven-plugi…

mysql - 缓存

缓存 InnoDB存储引擎在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以…

力扣hot100:207. 课程表

这是一道拓扑排序问题,也可以使用DFS判断图中是否存在环。详情请见:官方的BFS算法请忽略,BFS将问题的实际意义给模糊了,不如用普通拓扑排序思想。 数据结构:图的拓扑排序与关键路径 拓扑排序: class Sol…

交换机高级-端口安全

端口安全 1、一旦接口开启端口安全功能,那么接口所学到的动态MAC就会转换成安全MAC地址; 2、安全MAC地址默认情况下只能学习1个,可以通过命令手动修改学习数量; 3、安全MAC地址没有老化时间(但是依然存在内存中&…

2核4g服务器能支持多少人访问?阿里云2核4g服务器在线人数

阿里云2核4G服务器多少钱一年?2核4G配置1个月多少钱?2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…