学习笔记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
then
    commands
else
    if command2
    then
    commands
    fi
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/

引用自生信技

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

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

相关文章

Acer宏碁暗影骑士擎AN515-58笔记本电脑工厂模式原厂Win11系统ISO镜像安装包下载

宏基AN515-58原装出厂OEM预装Windows11系统工厂包,恢复出厂时开箱状态一模一样,带恢复还原功能 链接:https://pan.baidu.com/s/1iCVSYtList-hPqbyTyaRqQ?pwdt2gw 提取码:t2gw 宏基原装系统自带所有驱动、NITROSENSE风扇键盘灯…

WSL2 Ubuntu装ESP-IDF以及USB使用

一、前言 小编一开始是使用 Windows 开发ESP的芯片,但是 espidf 在Windows 环境下的编译速度是真的慢,想使用Ubuntu的环境,又不想使用装虚拟机,觉得虚拟机太麻烦了。就想到了 WSL 微软的子系统,介绍一下怎么在 WSL的子…

STL标准模板库(C++

在C里面有已经写好的标准模板库〈Standard Template Library),就是我们常说的STL库,实现了集合、映射表、栈、队列等数据结构和排序、查找等算法。我们可以很方便地调用标准库来减少我们的代码量。 size/empty 所有的STL容器都支持这两个方法&#xff0c…

影视文件数字指纹签名检验系统的用户操作安全大多数

国内网盘服务大规模出现版权问题。 一些个人或团体会通过云存储客户端将主要由电影、电视、音乐组成的文件上传到网盘,然后在圈子里分享。 可供下载。 大量受版权保护的视频音乐就是通过这种特殊的盗版方式传播的,而这种传播方式暂时不受监管。 一些云存…

建模杂谈系列93 增量TF-IDF

说明 简单就是美 说起来这个项目很早之前做过,最近用到,再梳理一次。 这篇文章草稿是在2021年的,现在是2024年,继续写完它。 内容 1 TF-IDF 来自百度的解释:TF-IDF是一种统计方法,用以评估一字词对于一个…

网络安全笔记-day8,DHCP部署

DHCP部署与安全 全称(Dynamic Host Configura Protocol)动态主机配置协议 DHCP原理 DHCP协议_科来测试dhcp网络包-CSDN博客🔍 注意的是利用广播地址发送包 ACK(确认) 如果DHCP服务器损坏,则在87.5%时…

Python Flask框架 -- flask-migrate迁移ORM模型

# 之前使用的这个db.create_all()很有局限性,它不能把在class里修改的东西同步上数据库,所以不用了 # with app.app_context(): # 请求应用上下文 # db.create_all() # 把所有的表同步到数据库中去 例如,在User类中增加一个email字段&…

2.6 IDE(集成开发环境)是什么

IDE(集成开发环境)是什么 IDE 是 Integrated Development Environment 的缩写,中文称为集成开发环境,用来表示辅助程序员开发的应用软件,是它们的一个总称。 通过前面章节的学习我们知道,运行 C 语言&…

各大pdf转word软件都用的哪家的ocr引擎?

国内一般的PDF软件一般都调用某国际PDF原厂的OCR接口,但这家公司是主要做PDF,在OCR方面并不专注,一些不是很复杂的场景还能应付得过来,复杂一点的效果就强差人意了,推荐用金鸣表格文字识别系统,它主要有以下…

基于CNN-RNN的动态手势识别系统实现与解析

一、环境配置 为了成功实现基于CNN-RNN的动态手势识别系统,你需要确保你的开发环境已经安装了以下必要的库和工具: Python:推荐使用Python 3.x版本,作为主要的编程语言。TensorFlow:深度学习框架,用于构建…

ElementPlus Upload组件使用compressorjs压缩图片上传

需求 Compressor.js 是一个用于在客户端(即在浏览器中)对图片进行压缩的 JavaScript 库。使用它有以下几个优点和意义: 减少文件大小: 图片通常是网页中占用大量带宽的资源之一。通过使用 Compressor.js 对图片进行压缩,可以显著…

力扣面试150 直线上最多的点数 数学 直线斜率 欧几里得求最大公约数

Problem: 149. 直线上最多的点数 思路 👨‍🏫 参考题解 💖 枚举直线 枚举统计 时间复杂度: O ( n 3 ) O(n^3) O(n3) 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public int maxPoints(int[][] points){int n points.length;int…

数据库之备份与恢复

MySQL完全备份与恢复 数据备份的重要性 在生产环境中,数据的安全性至关重要任何数据的丢失都可能产生严重的后果造成数据丢失的原因 程序错误 人为操作错误 运算错误 磁盘故障 灾难(如火灾、地震)和盗窃 数据库备份的分类 物理角度 物理备份:对数据库操作系统的…

【网络爬虫】(1) 网络请求,urllib库介绍

各位同学好,今天开始和各位分享一下python网络爬虫技巧,从基本的函数开始,到项目实战。那我们开始吧。 1. 基本概念 这里简单介绍一下后续学习中需要掌握的概念。 (1)http 和 https 协议。http是超文本传输&#xf…

Visual Studio项目编译和运行依赖第三方库的项目

1.创建项目,这里创建的项目是依赖于.sln的项目,非CMake项目 2.添加第三方库依赖的头文件和库文件路劲 3.添加第三方依赖库文件 4.项目配置有2个,一个是Debug,一个是Release,如果你只配置了Debug,编译和运行…

厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能原理篇

接着上一篇《厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能结构篇》继续总结一下厨余垃圾处理设备智能软硬件统的原理。所有的软硬件系统全是自己一人独自开发,看法和角度难免有局限性。希望抛砖引玉,将该智能软硬件系统分享给更多有类…

java的封装

封装概述 java中的封装指的是将一系列有关的事物的共同属性和行为提取出来放到一个类中,隐藏对象的实行和现实细节,仅对外提供公共的访问方式的操作。这样说起来感觉很抽象,也不好理解,这里不妨举一个例子。将配置电脑这个动作看成…

伪装目标检测之注意力CBAM:《Convolutional Block Attention Module》

论文地址:link 代码:link 摘要 我们提出了卷积块注意力模块(CBAM),这是一种简单而有效的用于前馈卷积神经网络的注意力模块。给定一个中间特征图,我们的模块依次推断沿着两个独立维度的注意力图&#xff…

Qt实现简易的多线程TCP服务器(支持多个客户端连接)附源码

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化,m_widget我们用于后续的显示消息等,说白了就是主界面的更新显示等 …

为何ChatGPT日耗电超50万度?

看新闻说,ChatGPT每天的耗电量是50万度,国内每个家庭日均的耗电量不到10度,ChatGPT耗电相当于国内5万个家庭用量。 网上流传,英伟达创始人黄仁勋说:“AI的尽头是光伏和储能”,大佬的眼光就是毒辣&#xff…