学习笔记Day15:Shell脚本编程

news2024/9/19 7:26:36

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/

引用自生信技

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

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

相关文章

Linux文件IO(2):使用标准IO进行文件的打开、关闭、读写、流定位等相关操作

目录 前言 文件的打开和关闭的概念 文件的打开 文件的打开函数 文件打开的模式 文件的关闭 文件的关闭函数 注意事项 字符的输入(读单个字符) 字符输入的函数 注意事项 字符的输出(写单个字符) 字符输出的函数 注意…

实战|使用 Node.js 和 htmx 构建全栈应用程序

在本教程中,我将演示如何使用 Node 作为后端和 htmx 作为前端来构建功能齐全的 CRUD 应用程序。这将演示 htmx 如何集成到全栈应用程序中,使您能够评估其有效性并确定它是否是您未来项目的不错选择。 htmx 是一个现代 JavaScript 库,旨在通过…

微服务day07 -- 搜索引擎 ( 数据聚合 + 自动补全 + 数据同步 + ES集群 )

1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些…

ydata_profiling:自动生成数据探索报告的Python库

之前在做数据分析的时候,用过一个自动化生成数据探索报告的Python库:ydata_profiling 一般我们在做数据处理前会进行数据探索,包括看统计分布、可视化图表、数据质量情况等,这个过程会消耗很多时间,可能需要上百行代码…

数据库实验(一)SQL Server触发器

目录 触发器的定义 触发器和存储过程的区别 触发器的优点 触发器的作用 触发器的分类 DML触发器 DDL触发器 登录触发器 触发器的工作原理 inserted表 deleted表 创建触发器 编程要求 测试要求: 实验代码: 触发器的定义 触发器是建立在触…

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务,搭配RTMP高清摄像头使用,可将无人机设备的实时流推送到平台上,实现无人机视频推流直播、巡检等应用。 有用户反馈,项目现…

深度学习基础知识

本文内容来自https://zhuanlan.zhihu.com/p/106763782 此文章是用于学习上述链接,方便自己理解的笔记 1.深度学习的网络结构 深度学习是神经网络的一种特殊形式,典型的神经网络如下图所示。 神经元:表示输入、中间数值、输出数值点。例如&…

itextPdf生成pdf简单示例

文章环境 jdk1.8&#xff0c;springboot2.6.13 POM依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><dependency><groupId>com.ite…

【前端面试3+1】01闭包、跨域

一、对闭包的理解 定义&#xff1a; 闭包是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点&#xff1a; 闭包可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。…

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

出现的错误&#xff1a; [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…

输出当前时间

用途&#xff1a;在项目中一些属性中设置当前时间 实例代码 import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class time {public static void main(String[] args){LocalDateTime china LocalDateTime.now(); DateTimeFormatter forma…

SpringBoot学习之ElasticSearch下载安装和启动(Mac版)(三十一)

本篇是接上一篇Windows版本,需要Windows版本的请看上一篇,这里我们继续把Elasticsearch简称为ES,以下都是这样。 一、下载 登录Elasticsearch官网,地址是:Download Elasticsearch | Elastic 进入以后,网页会自动识别系统给你提示Mac版本的下载链接按钮 二、安装 下载…

深度学习 - PyTorch基本流程 (代码)

直接上代码 import torch import matplotlib.pyplot as plt from torch import nn# 创建data print("**** Create Data ****") weight 0.3 bias 0.9 X torch.arange(0,1,0.01).unsqueeze(dim 1) y weight * X bias print(f"Number of X samples: {len(…

huawei 华为 交换机 配置 LACP 模式的链路聚合示例 (交换机之间直连)

组网需求 如 图 3-22 所示&#xff0c; SwitchA 和 SwitchB 通过以太链路分别都连接 VLAN10 和 VLAN20 的网络&#xff0c;且SwitchA 和 SwitchB 之间有较大的数据流量。用户希望 SwitchA 和 SwitchB 之间能够提供较大的链路带宽来使相同VLAN 间互相通信。在两台 Switch 设备上…

flask_restful规范返回值之参数设置

设置重命名属性和默认值 使用 attribute 配置这种映射 , 比如&#xff1a; fields.String(attributeusername) 使用 default 指定默认值&#xff0c;比如&#xff1a; fields.String(defaultsxt) from flask import Flask,render_template from flask_restful import A…

C++ 输入与输出

数据输入输出 数据是程序处理的对象&#xff0c;输入输出操作是程序中不可或缺少的部分&#xff0c;C中输入输出操作都是通过函数调用实现的&#xff1b;C提供了一个“标准I/O库”。 格式输出函数-----printf 基本形式是&#xff1a; printf(“控制字符串”,输出项列表); 功能…

openwrt在校园网环境下开启nat6 (ipv6 nat)

如果将路由器接入校园网&#xff0c;我们只能获得一个128位掩码的ipv6地址。这个地址仅供路由器本身使用&#xff0c;而路由器后的设备无法获取到ipv6地址&#xff0c;因此我们可以利用网络地址转换&#xff08;NAT&#xff09;为这些设备分配本地ipv6地址。 下面是openwrt开启…

【C++练级之路】【Lv.16】红黑树(冰与火的碰撞,红与黑的史诗)

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、红黑树的概念二、红黑树的模拟实现2.1 结点2.2 成员变量2.3 插入情况一&#xff1a;uncle在左&#xff…

Linux-进程控制(进程创建、进程终止、进程等待)

一、进程创建 1.1 fork函数介绍 在命令行下我们可以通过 ./ exe文件 来创建一个进程&#xff0c;通过fork函数&#xff0c;我们可以通过代码的形式从一个进程中创建一个进程&#xff0c;新进程为子进程&#xff0c;原进程为父进程&#xff0c;子进程在创建时&#xff0c;会与…

LabVIEW智能降噪系统

LabVIEW智能降噪系统 随着噪声污染问题的日益严重&#xff0c;寻找有效的降噪技术变得尤为关键。介绍了一种基于LabVIEW平台开发的智能降噪系统&#xff0c;该系统能够实时采集环境噪声&#xff0c;并通过先进的信号处理技术实现主动降噪&#xff0c;从而有效改善生活和工作环…