Linux Shell 脚本

2022-10-25 19:28:47 浏览数 (2)

一、变量

1.1 什么是变量?

变量是计算机编程中非常重要的一个概念。变量就是可以变化的量,与常量相反,例如一个固定的数字,字符属于常量。变量是计算机语言中能储存计算结果或能表示值的抽象概念。

定义一个变量,其实就是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储运行时可更改的程序信息。

变量需要赋值,这个值可以是一个数字,字符,也可以是更多内容。变量在程序运行过程中可以不停变化。一些程序语言在定义变量的时候需要声明变量类型,一些可以直接定义变量。

在 Shell 语言中,可以直接定义变量。不过需要注意,在定义变量的过程中需要遵守一定的规则。这与绝大部分的编程语言类似。

1、可以用字母、下划线、数字组成;

2、变量名只能由字母或下划线开头,不能以数字开头;

3、变量名不能具有二义性;

4、不要与系统内置关键字重名;

5、shell 中一般变量使用大写;

6、赋值时等号两侧不能有空白“a=2”;

代码语言:javascript复制
(base) xiehs 16:23:17 ~/08.shell
$ a=1
(base) xiehs 16:23:19 ~/08.shell
$ b=2

1.2 shell 变量的引用

在 shell 中,直接使用“$”符,即可引用变量的值;一般配合 echo 命令可以打印变量的值;

代码语言:javascript复制
(base) xiehs 16:23:21 ~/08.shell
$ echo $a $b
1 2
(base) xiehs 16:23:57 ~/08.shell
$ echo $a
1
(base) xiehs 16:23:59 ~/08.shell
$ echo $b
2

如果变量名之后接有其他字符,可以使用”{}”进行区分。例如下面的案例。

代码语言:javascript复制
(base) xiehs 16:24:01 ~/08.shell
$ a=illumina
(base) xiehs 16:24:23 ~/08.shell
$ echo ${a}_1.fq.gz ${a}_2.fq.gz
illumina_1.fq.gz illumina_2.fq.gz

1.3 内置变量

环境变量

使用 env 或者 set 可以查看系统内置变量,例如 PATH 变量。可以使用 echo 命令直接查看。

通过 export 命令加入环境中。如果想永久修改,需要添加到家目录中的“.bashrc”文件中。

代码语言:javascript复制
(base) xiehs 16:25:02 ~/08.shell
$ echo $PS1
(base) [e[31;1m]u[e[0m] [e[32;1m]t [e[0m][e[34;1m]w[e[0m]n[e[31;1m]$ [e[0m]
(base) xiehs 16:26:55 ~/08.shell
$ echo $LANG
en_US.UTF-8
(base) xiehs 16:27:04 ~/08.shell
$ echo $HISTSIZE
1000

二、循环

2.1 for 循环

代码语言:javascript复制
#连续数字
echo {1..10}

#用户控制循环次数
for i in {1..10};do echo $i;done;

#连续字符串
echo {a..k}
for i in {a..k};do echo "$i";done;

#进度条
for i in {1..100};do  printf "rComplete: %d%%" $i;sleep 0.1;done;

#批量生成文件
for i in {A..J};do echo touch sample${i}_1.fq.gz sample${i}_2.fq.gz;done;
for i in {A..J};do touch sample${i}_1.fq.gz sample${i}_2.fq.gz;done;

#批量操作
ls -1 *.fq.gz 
for i in *.fq.gz ;do echo "fastqc -f fastq "${i};done;

2.2 while 循环

代码语言:javascript复制
ls -1 *.fq.gz | xargs -n 2
ls -1 *.fq.gz | xargs -n 2 | while read {i,j};do echo $i,$j;done;

# 生成脚本
ls -1 *.fq.gz | xargs -n 2 | while read {i,j};do echo "spades.py -1 $i -2 $j -o spades";done;
# 生成更加完美的脚本
ls -1 *.fq.gz | xargs -n 2 | while read {i,j};do echo "spades.py -1 $i -2 $j -o ${i%_*}";done;

#生成数据列表
ls *.fq.gz | xargs  -I{} echo "$PWD/{}" | xargs -n 2 | awk -F "/" '{print $6,$0}' | sed -e 's/_1.fq.gz//1'
ls *.fq.gz | xargs  -I{} echo "$PWD/{}" | xargs -n 2 | awk -F "/" '{print $6,$0}' | sed -e 's/_1.fq.gz//1' >reads.list

#生成脚本
cat reads.list | while read {i,j,k};do echo $i,$j,$k;done;
#校验md5
for i in *.md5;do md5sum -c ${i};done;
ls -1 *.md5 | while read i;do md5sum -c ${i};done;

三、判断

代码语言:javascript复制
if [ -f $PWD/reads.list ];then echo "file exist!";else echo "no such file or dirctory";fi;

#1 一个简单脚本
#/bin/bash

a=$1
b=$2
if [ $a == $b ]
then
    echo "a = b"
elif [ $a -gt $b ]
then
    echo "a > b"
elif [ $a -lt $b ]
then
    echo "a < b"
else
    echo "no condition"
fi

写在最后:有时间我们会努力更新的。大家互动交流可以前去论坛,地址在下面,复制去浏览器即可访问,弥补下公众号没有留言功能的缺憾。原地址暂未启用(bioinfoer.com)。

代码语言:javascript复制
sx.voiceclouds.cn

有些板块也可以预设为大家日常趣事的分享等,欢迎大家来提建议。

0 人点赞