学习笔记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.mzph.cn/news/771556.shtml

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

相关文章

C++函数模板详解(结合代码)

目录 1. 模板概念 2. 函数模板语法 3. 函数模板注意事项 4. 函数模板案例 5. 普通函数与函数模板的区别 6. 普通函数与函数模板的调用规则 7. 模板的局限性 1. 模板概念 在C中,模板是一种通用的程序设计工具,它允许我们处理多种数据类型而不是固…

Symbol 类型必知必会

一. Symbol的概念 Symbol 是 JavaScript 中的一种新的基本数据类型,引入自 ECMAScript 6(ES6)标准。它是一种不可变且唯一的数据类型,可以用来创建独一无二的键(key)。 Symbol 的创建方式是通过调用全局的…

测试开发工程师(QA)职业到底需要干些什么?part4:安全QA

安全测试开发QA工作的主要目标是确保软件、应用程序或系统在安全方面的健壮性和可靠性。以下是安全测试开发QA工作中的一些常见任务和职责: 安全测试计划和策略:安全测试开发QA团队负责制定全面的安全测试计划和策略。他们会评估应用程序或系统的安全需求…

【优选算法】专题1 -- 双指针 -- 复写0

前言: 补充一下前文没有写到的双指针入门知识:专题1 -- 双指针 -- 移动零 目录 基础入门知识: 1. 复写零(easy) 1. 题⽬链接:1089.复习0 - 力扣(LeetCode) 2. 题⽬描述&#xff…

数据容器-dict以及总结-Python

师从黑马程序员 字典的定义 同样使用{},不过存储的元素是以个个的:键值对,如下语法: #定义字典 my_dict1{"王力宏":99,"周杰伦":88,"林俊杰":77} #定义空字典 my_dict2{} my_dict3dict() print(f"字典1…

springboot 将manage关闭。

这是SpringBoot自带的接口,会将所有的接口暴露在外面。所以我们上生产环境,需要将这个接口给关闭。 默认是 management.endpoints.web.exposure.include* 只需将配置文件改成下面,Springboot自带的接口就会关闭。 management.endpoints.…

【物联网开源平台】tingsboard二次开发

别看这篇了,这篇就当我的一个记录,我有空我再写过一篇,编译的时候出现了一个错误,然后我针对那一个错误执行了一个命令,出现了绿色的succes,我就以为整个tingsboard项目编译成功了,后面发现的时候&#xff…

记录微信小程序云开发的增删改查

目录 一、准备工作 1、创建集合添加数据 2、设置数据权限 3、小程序连接数据库 二、增删改查 1.查 1、查询单集合所有数据 2、条件查询 1、直接:相当于等于 2、调用指令 3、查询单条(根据id查询) 2.增 3.改 4.删 一、准备工作 1、创建集合添…

力扣---最长公共子序列---二维动态规划

思想: 定义g[i][j]:text1的前i位和text2的前j位的最长公共子序列长度。递推公式:如果text[i]text[j],那么只需要看g[i-1][j-1]即可,此时g[i][j]g[i-1][j-1]1。如果text[i]!text[j],那么g[i][j]max(g[i-1][j…

【研发管理】研发管理规范

研发管理规范 目的定义工作职责产品经理项目经理运维负责人研发负责人研发工程师 基本原则研发过程描述需求分析分析设计研发实现测试验收发布上线线上监控 目的 软件研发相关管理,有效控制技术风险,提高研发和运行质量 定义 包括需求分析、分析设计…

【C】盛最多水的容器(双指针)

盛最多水的容器 原题目链接:点击跳转 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和(i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说…

小学生古诗文大会往届真题测一测(来自主办方)和非常详细的解析

新学期开学一眨眼已经过了一个多月了,有家长朋友开始关心2024年上海市小学生古诗文大会什么时候开始?如何准备小学生古诗文大会?如何激发孩子学习古诗词的兴趣?如何提高小学古诗词和古诗文大会的学习成绩?... 最近&…

基于SpringBoot+Vue共享汽车管理系统(源码+部署说明+演示视频+源码介绍)

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

3.25C++

定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream> #include <cstring> usi…

网络基础二——序列化与反序列化

1、应用层 我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在应用层。 2、再谈“协议” 协议是一种 " 约定 "。 socket api 的接口 , 在读写数据时 , 都是按 " 字符串 " 的方式来发送接收的 . 如果我们…

c++模拟银行家算法

在复习408时,使用代码模拟能够加深对知识点的理解 1.银行家算法介绍 银行家算法是迪杰斯特拉发明的死锁避免的算法。找到合理的资源分配序列保证各进程的正常推进是银行家算法的核心。 2.自定义类以及成员变量和成员函数说明 进程类 //进程类 class Process; //资源最大需求…

FPGA之状态机学习

作为一名逻辑工程师&#xff0c;掌握和应用状态机设计是必不可少的。能够灵活的应用状态机是对逻辑工程师最基本的要求&#xff0c;状态机设计的好坏能够直接影响到设计系统的稳定性&#xff0c;所以学会状态机是非常的重要。 1.状态机的概念 状态机通过不同的状态迁移来完成特…

【C语言】Infiniband驱动__mlx4_init_one函数

一、注释 Linux内核驱动程序中的部分&#xff0c;属于Mellanox网卡驱动mlx4的初始化过程。 // Mellanox 以太网驱动主程序代码 static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,struct mlx4_priv *priv) {int err; // 错误码变量int nvfs[MLX4_MAX_PORTS…

【SSH配置公钥私钥免密登录】

SSH配置公钥私钥免密登录 SSH的安全机制一、修改远程主机ssh设置二、在windows客户端生成公钥私钥文件三、将客户端公钥追加到远程主机 .ssh/authorized_keys中参考链接 SSH的安全机制 SSH之所以能够保证安全&#xff0c;原因在于它采用了非对称加密技术(RSA)加密了所有传输的…

机载激光雷达标定板提高测量精度

机载激光雷达系统标定板&#xff08;LiDAR&#xff09;是一种高精度的遥感技术&#xff0c;它通过发射激光脉冲并接收反射回来的光波来测量目标物体的距离。这种技术在测量地形、建筑物、植被等方面有着广泛的应用。为了确保机载激光雷达系统的数据准确性和可靠性&#xff0c;需…