Linux基础入门(学习笔记通俗易懂版)

本文章是学习了Linux的学习记录,着重记录了我对于Linux各命令的用法与感悟,欢迎各位大佬批评指正

记录者:CYH-BI

记录日期:2023年7月7日

本篇文章将使用虚拟机并安装centos 进行实操。关于虚拟机的安装请看其他教程,篇幅过长,不一展示。

Linux简介部分

Linux起初由Linus Torvalds与1991年编写,本质上是一个UNIX操作系统。目前的发行版本有Linux内核、shell环境、桌面软件、各类系统管理软件和应用软件共同构成的一个完整的Linux操作系统。在终端输入命令后,系统将命令输给内核执行,将返回的结果输出到指定位置。

根文件系统结构简介

文件系统结构与window系统类似(但差异较大),Linux系统含有一个根目录(/),该目录下又含有众多二级目录,如:

  • /bin (binary):存放可执行文件
  • /dev (device):存放设备文件和特殊文件 (比如光盘)
  • /etc :存放系统配置文件
  • /home :普通的主目录所在位置
  • /lib :存放基本共享文件和内核模块
  • /mut (mount): 用于为需要挂在的文件系统提供挂在点(比如U盘)
  • /proc (process):存放于内核和进程有关的信息
  • /root :根目录的主目录
  • /usr (user):存放可共享的只读数据文件
  • /var (variable):存放分类数据文件

路经的使用于window类似,比如我要进入某用户(lh)目录下的my目录,那么全路径为:/home/lh/my

第一个 / 表示根目录,lh用户在home目录下,my目录在lh下。

基本命令用法即实操

  • shutdown

    功能:关闭、重启系统

    命令格式:

    shutdown [选项] 时间
    

    主要参数:

    -r (reboot) :重启系统

    -h (halt) :关闭系统

    -P (poweroff) :关机(关闭系统与电源)

    用法举例:

    shutdown -h 5 #5分钟后关机
    shutdown -r #立即重启系统
    shutdown -r 5 #5分钟后重启系统
    #上述太麻烦了,花里胡哨的,我一般使用下面的
    reboot   #重启系统
    poweroff  #立即关机
    
  • clear :清除当前屏幕(或终端)上显示的内容

  • su :普通用户转root用户,普通用户是 $ 开头,root 用户是 # 开头。该命令需要输入密码,且密码不可见,需要盲打。

  • man (manual):显示命令的说明手册

    命令格式:

    man 命令名
    

    如果你某个命令忘记了如何使用或者是命令有哪些参数,该命令可以给出详解,举例如下

    [cyh@localhost Desktop]$ man shutdown #回车,弹出说明文档,按q退出
    

    man 命令麻烦了一点,我更喜欢命令加 –help 来显示用法,比如:

    [cyh@localhost Desktop]$ shutdown --help  #直接在屏幕输出各参数以及用法
    shutdown [OPTIONS...] [TIME] [WALL...]
    
    Shut down the system.
    
         --help      Show this help
      -H --halt      Halt the machine
      -P --poweroff  Power-off the machine
      -r --reboot    Reboot the machine
      -h             Equivalent to --poweroff, overridden by --halt
      -k             Don't halt/power-off/reboot, just send warnings
         --no-wall   Don't send wall message before halt/power-off/reboot
      -c             Cancel a pending shutdown
    [cyh@localhost Desktop]$
    
  • history :查看你使用过的所有命令,默认显示所有,可以指定显示条数(最近的)

    命令格式:

    history [查看命令行数]
    

    用法举例:

    [cyh@localhost Desktop]$ history 10  #显示最后10行
      448  vim log2.sh
      449  cat log2.sh
      450  bash log2.txt
      451  bash log2.sh
      452  who
      453  who -q
      454  man shutdown
      455  shutdown --help
      456  history -10
      457  history 10
    
  • ls (list)命令

    功能:默认显示当前目录下的文件列表。如果所给参数是指定到某文件,则列出该文件有关信息

    主要选项:

    -a (all):表示列出目录所有项,包括以“ . ”开始的隐藏文件

    -l (list):以列表形式列出文件

    -d (directory):仅列出目录本身信息

    -R(recursive):递归列出子目录内容

    部分举例如下:

    [cyh@localhost Desktop]$ ls   #在我的桌面上有6个文件,使用ls命令显示
    gen2go.txt  gene2go  log2.sh  log2.txt  log.txt  shiyan5
    [cyh@localhost Desktop]$ ls ./shiyan5 #列出shiyan5中所有文件,"./"表示当前文件路径,是"/home/cyh/Desktop"的简写,与ls /home/cyh/Desktop/shiyan5是一样的
    guess_number.sh               identical_line.sh
    identical_filebreaklines2.sh  identical_user.sh
    identical_filebreaklines.sh   sum_and_product2.sh
    identical_file.sh
    [cyh@localhost Desktop]$ ls -l #-l参数,以列表形式列出文件
    total 218464
    -rw-rw-r--. 1 cyh  cyh   28788565 Jun 13 04:00 gen2go.txt
    -rw-rw-r--. 1 cyh  cyh  194901303 Jun 13 03:58 gene2go
    -rw-rw-r--. 1 cyh  cyh         63 Jul  6 09:37 log2.sh
    -rw-rw-r--. 1 cyh  cyh        985 Jul  6 09:38 log2.txt
    -rw-r--r--. 1 root root       236 Jul  5 23:12 log.txt
    drwxrwxr-x. 2 cyh  cyh        233 Apr 22 03:27 shiyan5
    [cyh@localhost Desktop]$ ls -a #表示列出目录所有项,包括以“ . ”开始的隐藏文件,结果显示有两个隐藏文件
    .  ..  gen2go.txt  gene2go  log2.sh  log2.txt  log.txt  shiyan5
    [cyh@localhost Desktop]$ ls -d  #仅列出目录本身信息
    .
    [cyh@localhost Desktop]$ ls -R  #递归列出子目录,在shiyan5文件中,含有子文件,也一一列出
    .:
    gen2go.txt  gene2go  log2.sh  log2.txt  log.txt  shiyan5
    
    ./shiyan5:
    guess_number.sh               identical_line.sh
    identical_filebreaklines2.sh  identical_user.sh
    identical_filebreaklines.sh   sum_and_product2.sh
    identical_file.sh
    [cyh@localhost Desktop]$ ls -lR #参数可以叠加使用,以列表的形式递归列出文件
    .:
    total 218464
    -rw-rw-r--. 1 cyh  cyh   28788565 Jun 13 04:00 gen2go.txt
    -rw-rw-r--. 1 cyh  cyh  194901303 Jun 13 03:58 gene2go
    -rw-rw-r--. 1 cyh  cyh         63 Jul  6 09:37 log2.sh
    -rw-rw-r--. 1 cyh  cyh        985 Jul  6 09:38 log2.txt
    -rw-r--r--. 1 root root       236 Jul  5 23:12 log.txt
    drwxrwxr-x. 2 cyh  cyh        233 Apr 22 03:27 shiyan5
    
    ./shiyan5:
    total 28
    -rw-rw-r--. 1 cyh cyh 361 Apr 22 03:24 guess_number.sh
    -rw-rw-r--. 1 cyh cyh 228 Apr 22 02:16 identical_filebreaklines2.sh
    -rw-rw-r--. 1 cyh cyh 338 Apr 22 02:05 identical_filebreaklines.sh-rw-rw-r--. 1 cyh cyh 205 Apr 22 01:01 identical_file.sh
    -rwxrw-r--. 1 cyh cyh 191 Apr 21 02:18 identical_line.sh
    -rwxrw-r--. 1 cyh cyh 214 Apr 21 03:06 identical_user.sh
    -rw-rw-r--. 1 cyh cyh 185 Apr 22 02:56 sum_and_product2.sh
    
  • pwd (print working directory)命令,字面意思,打印当前的目录(工作目录)完整路径

    命令格式:

    pwd [选项]
    

    举例如下:

    [cyh@localhost Desktop]$ pwd
    /home/cyh/Desktop
    
  • cd (change directory)更改当前目录,不加参数转跳到用户的主目录

    命令格式:

    cd [选项] [文件或目录路径]
    

    举例如下:

    [cyh@localhost Desktop]$ cd ./shiyan5 #更改路径到shiyan5
    [cyh@localhost shiyan5]$ pwd  #显示当前目录完整路径
    /home/cyh/Desktop/shiyan5
    [cyh@localhost shiyan5]$ cd     #不加任何参数,转跳至用户主目录,可看下行"~"
    [cyh@localhost ~]$ cd /home/cyh/Desktop/shiyan5  #使用全路径
    [cyh@localhost shiyan5]$       #到达shiyan5目录
    
    [cyh@localhost shiyan5]$ cd ..  #返回上一层目录
    [cyh@localhost Desktop]$ cd ../..    #返回上两层目录
    
  • stat 获取某文件基本信息

    命令格式:

    stat 文件或路径
    

    举例:

    [cyh@localhost shiyan5]$ ll  #查看以下该目录下有什么文件
    total 28
    -rw-rw-r--. 1 cyh cyh 361 Apr 22 03:24 guess_number.sh
    -rw-rw-r--. 1 cyh cyh 228 Apr 22 02:16 identical_filebreaklines2.sh
    -rw-rw-r--. 1 cyh cyh 338 Apr 22 02:05 identical_filebreaklines.sh
    -rw-rw-r--. 1 cyh cyh 205 Apr 22 01:01 identical_file.sh
    -rwxrw-r--. 1 cyh cyh 191 Apr 21 02:18 identical_line.sh
    -rwxrw-r--. 1 cyh cyh 214 Apr 21 03:06 identical_user.sh
    -rw-rw-r--. 1 cyh cyh 185 Apr 22 02:56 sum_and_product2.sh
    [cyh@localhost shiyan5]$ stat ./sum_and_product2.sh  #查看该目录下sum_and_product2.sh文件,结果如下所示
      File: ‘./sum_and_product2.sh’
      Size: 185             Blocks: 8          IO Block: 4096   regular file
    Device: fd00h/64768d    Inode: 78261       Links: 1
    Access: (0664/-rw-rw-r--)  Uid: ( 1000/     cyh)   Gid: ( 1000/     cyh)
    Context: unconfined_u:object_r:user_home_t:s0
    Access: 2023-04-22 02:56:37.126073472 -0400
    Modify: 2023-04-22 02:56:33.784094697 -0400
    Change: 2023-04-22 02:56:33.785094676 -0400
     Birth: -
    [cyh@localhost shiyan5]$
    
  • touch 命令

    更新一个文件的访问和修改时间,如果没有该文件则新建该文件(我一般用来新建文件)

    命令格式:

    touch 文件或路径目录
    

    举例:

    [cyh@localhost Desktop]$ touch first_file.txt  #在桌面上新建first_file.txt文件
    [cyh@localhost Desktop]$ ll  #查看以下桌面文件,ll为' ls -l '的简写
    total 218464
    -rw-rw-r--. 1 cyh  cyh          0 Jul 11 12:07 first_file.txt
    -rw-rw-r--. 1 cyh  cyh   28788565 Jun 13 04:00 gen2go.txt
    -rw-rw-r--. 1 cyh  cyh  194901303 Jun 13 03:58 gene2go
    -rw-rw-r--. 1 cyh  cyh         63 Jul  6 09:37 log2.sh
    -rw-rw-r--. 1 cyh  cyh        985 Jul  6 09:38 log2.txt
    -rw-r--r--. 1 root root       236 Jul  5 23:12 log.txt
    drwxrwxr-x. 2 cyh  cyh        233 Apr 22 03:27 shiyan5
    [cyh@localhost Desktop]$
    
  • mkdir 命令:新建目录

    部分参数:

    -p 递归创建目录

    -m 给文件赋予某权限(请看下一个命令)

    命令格式:

    mkdir 目录路径
    

    举例:

    [cyh@localhost Desktop]$ mkdir first_dir #在当前目录下创建first_dir文件夹
    [cyh@localhost Desktop]$ ls -l  #查看结果中是否有first_dir文件(结果第一个就是)
    total 218464
    drwxrwxr-x. 2 cyh  cyh          6 Jul 11 12:14 first_dir
    -rw-rw-r--. 1 cyh  cyh          0 Jul 11 12:07 first_file.txt
    -rw-rw-r--. 1 cyh  cyh   28788565 Jun 13 04:00 gen2go.txt
    -rw-rw-r--. 1 cyh  cyh  194901303 Jun 13 03:58 gene2go
    -rw-rw-r--. 1 cyh  cyh         63 Jul  6 09:37 log2.sh
    -rw-rw-r--. 1 cyh  cyh        985 Jul  6 09:38 log2.txt
    -rw-r--r--. 1 root root       236 Jul  5 23:12 log.txt
    drwxrwxr-x. 2 cyh  cyh        233 Apr 22 03:27 shiyan5
    

看到这里,新手就有疑惑了,有很多东西看不懂,比如,使用 ll -l 命令返回结果怎么看,那么请看如下:

drwxrwxr-x. 2 cyh  cyh          6 Jul 11 12:14 first_dir
-rw-rw-r--. 1 cyh  cyh          0 Jul 11 12:07 first_file.txt

在这里我截取了部分文件信息,我拆开来解释:

drwxrwxr-x. 2 cyh  cyh          6 Jul 11 12:14 first_dir
第一个字母 d ,表示这是一个目录(directory),如果是 - ,代表这是个文件
rwxrwxr-x ,r 代表可读(read), w 代表可写(write),x 代表可执行,- 代表没有
           前三个表示管理员(root)对该文件所拥有的权限(rwx,可读可写可执行)
           中间三个表示该文件的拥有者对该文件所拥有的权限(rwx,可读可写可执行)
           左后三个表示除了上面两种,其他人对该文件所拥有的权限(r-x,可读不可写可执行)
           rwx可用数字表示,r=4,w=2,x=1
cyh 第一个表示用户名,第二个表示所属组
6 Jul 11 12:14 创建或修改日期

创建一个最高权限的first_file2目录

mkdir -m 777  first_file2

第一个7,表示管理员拥有的权限,4+2+1 (rwx),同理,第二个表示目录所属者,第三个所属组其他人

  • mv 命令

    功能:移动或重命名文件或目录

    命令格式:

    mv [选项] 源文件或目录路径 目标文件或目录路径
    

    主要选项:

    -b (backup):如果存在同名文件,覆盖前先备份原来的文件。

    -f (force):强制覆盖同名文件

    使用举例:

    [cyh@localhost first_dir]$ touch test1 test2  #先创建两个文件
    [cyh@localhost first_dir]$ ll   #查看一下结果,该命令为 ls -l 的缩写
    total 0
    -rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1
    -rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test2
    [cyh@localhost first_dir]$ mv -b test2 test1  #将test2改名为test1
    [cyh@localhost first_dir]$ ll   #查看一下结果,该命令为 ls -l 的缩写,test1~表示备份文件
    total 0
    -rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1
    -rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1~
    [cyh@localhost first_dir]$ mv test1 /home/cyh/Desktop/shiyan5 #将test1移动到这个目录
    [cyh@localhost first_dir]$ ll /home/cyh/Desktop/shiyan5  #查看结果,有test1文件
    total 28
    -rw-rw-r--. 1 cyh cyh 361 Apr 22 03:24 guess_number.sh
    -rw-rw-r--. 1 cyh cyh 228 Apr 22 02:16 identical_filebreaklines2.sh
    -rw-rw-r--. 1 cyh cyh 338 Apr 22 02:05 identical_filebreaklines.sh
    -rw-rw-r--. 1 cyh cyh 205 Apr 22 01:01 identical_file.sh
    -rwxrw-r--. 1 cyh cyh 191 Apr 21 02:18 identical_line.sh
    -rwxrw-r--. 1 cyh cyh 214 Apr 21 03:06 identical_user.sh
    -rw-rw-r--. 1 cyh cyh 185 Apr 22 02:56 sum_and_product2.sh
    -rw-rw-r--. 1 cyh cyh   0 Jul 13 01:05 test1
    [cyh@localhost first_dir]$
    
  • cp (copy)复制文件或目录

    命令格式:

    cp [选项] 源文件或者目录路径 目标文件或路径
    

    主要选项:

    -f (force):强制覆盖同名文件

    -b (backup):如果存在同名文件,覆盖前先备份原来的文件。

    -r (recursive):以递归的方式复制文件(一个目录里可能还有目录,该该项可以复制目录里面的所有所有)

    举例:

    [cyh@localhost first_dir]$ ll #查看first_dir内容
    total 0
    -rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1~
    [cyh@localhost first_dir]$ cp /home/cyh/Desktop/shiyan5/test1 /home/cyh/Desktop/first  #将shiyan5中的test1文件复制到first_dir中
    _dir
    [cyh@localhost first_dir]$ ll #再次查看first_dir内容
    total 0
    -rw-rw-r--. 1 cyh cyh 0 Jul 13 01:22 test1
    -rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1~
    [cyh@localhost first_dir]$ ll /home/cyh/Desktop/shiyan5 #查看shiyan5内容,test1还在
    total 28
    -rw-rw-r--. 1 cyh cyh 361 Apr 22 03:24 guess_number.sh
    -rw-rw-r--. 1 cyh cyh 228 Apr 22 02:16 identical_filebreaklines2.sh
    -rw-rw-r--. 1 cyh cyh 338 Apr 22 02:05 identical_filebreaklines.sh
    -rw-rw-r--. 1 cyh cyh 205 Apr 22 01:01 identical_file.sh
    -rwxrw-r--. 1 cyh cyh 191 Apr 21 02:18 identical_line.sh
    -rwxrw-r--. 1 cyh cyh 214 Apr 21 03:06 identical_user.sh
    -rw-rw-r--. 1 cyh cyh 185 Apr 22 02:56 sum_and_product2.sh
    -rw-rw-r--. 1 cyh cyh   0 Jul 13 01:05 test1
    [cyh@localhost first_dir]$ cp -r /home/cyh/Desktop/shiyan5 /home/cyh/Desktop/first_di #复制目录,将shiyan5整个目录复制到first_dir中
    r
    [cyh@localhost first_dir]$ ll  #查看一下first_dir中的内容,存在shiyan5且是个目录
    total 0
    drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:26 shiyan5
    -rw-rw-r--. 1 cyh cyh   0 Jul 13 01:22 test1
    -rw-rw-r--. 1 cyh cyh   0 Jul 13 01:05 test1~
    [cyh@localhost first_dir]$ ll /home/cyh/Desktop  #查看一下桌面上的shiyan5还在不在,答案是在
    total 218464
    drwxrwxr-x. 3 cyh  cyh         48 Jul 13 01:26 first_dir
    -rw-rw-r--. 1 cyh  cyh          0 Jul 11 12:07 first_file.txt
    -rw-rw-r--. 1 cyh  cyh   28788565 Jun 13 04:00 gen2go.txt
    -rw-rw-r--. 1 cyh  cyh  194901303 Jun 13 03:58 gene2go
    -rw-rw-r--. 1 cyh  cyh         63 Jul  6 09:37 log2.sh
    -rw-rw-r--. 1 cyh  cyh        985 Jul  6 09:38 log2.txt
    -rw-r--r--. 1 root root       236 Jul  5 23:12 log.txt
    drwxrwxr-x. 2 cyh  cyh        246 Jul 13 01:11 shiyan5
    [cyh@localhost first_dir]$
    

    当一个目录里有许多文件时,复制该目录时,应使用递归复制(-r),否则报错哦!

  • rm (remove):该命令用于删除文件或目录

    命令格式:

    rm [选项] 文件或路径
    

    -f (force):强制删除文件

    -r (recursive):递归的意思,可以删除某目录下的所有文件基子目录

    用法举例:

    [cyh@localhost first_dir]$ ll  #查看该目录下有什么
    total 0
    drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:26 shiyan5
    -rw-rw-r--. 1 cyh cyh   0 Jul 13 01:22 test1
    -rw-rw-r--. 1 cyh cyh   0 Jul 13 01:05 test1~
    [cyh@localhost first_dir]$ rm test1~  #删除test1~备份文件
    [cyh@localhost first_dir]$ ll  #查看结果,删掉了
    total 0
    drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:26 shiyan5
    -rw-rw-r--. 1 cyh cyh   0 Jul 13 01:22 test1
    [cyh@localhost first_dir]$ rm -r /home/cyh/Desktop/first_dir #递归删除first_dir目录中的内容
    [cyh@localhost first_dir]$ ll  #查看结果,显示温控
    total 0
    [cyh@localhost first_dir]$
    

    有些文件需要还能加参数 -f ,但是请谨慎操作,一旦使用 -f 删除,就永久删除,无法找回。

  • rmdir :删除目录,特别注意只能删除空目录

    用法举例:

    [cyh@localhost shiyan1]$ ll
    total 0
    drwxrwxr-x. 2 cyh cyh  6 Jul 29 09:58 shiyan2
    drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
    [cyh@localhost shiyan1]$ rmdir shiyan_feikng
    rmdir: failed to remove ‘shiyan_feikng’: Directory not empty  #提示错误,目录不为空
    [cyh@localhost shiyan1]$ ll shiyan2  #shiyan2为空
    total 0
    [cyh@localhost shiyan1]$ rmdir shiyan2  #空目录删除
    [cyh@localhost shiyan1]$ ll
    total 0
    drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
    
  • cat (concatenate) :查看文件内容

    命令格式:

    cat [选项] 文件路径
    

    -n 显示行号(number)

    用法举例:

    [cyh@localhost shiyan1]$ cat sample.txt #当前目录下查看sample.txt文件内容
    
    The linux system is great
    I like it
    2023.07.29
    [cyh@localhost shiyan1]$ cat -n sample.txt  #显示行号
         1
         2  The linux system is great
         3  I like it
         4  2023.07.29
    [cyh@localhost shiyan1]$ cat --help  #其他参数详细如下
    Usage: cat [OPTION]... [FILE]...
    Concatenate FILE(s), or standard input, to standard output.
    
      -A, --show-all           equivalent to -vET
      -b, --number-nonblank    number nonempty output lines, overrides -n
      -e                       equivalent to -vE
      -E, --show-ends          display $ at end of each line
      -n, --number             number all output lines
      -s, --squeeze-blank      suppress repeated empty output lines
      -t                       equivalent to -vT
      -T, --show-tabs          display TAB characters as ^I
      -u                       (ignored)
      -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
          --help     display this help and exit
          --version  output version information and exit
    
    With no FILE, or when FILE is -, read standard input.
    
    Examples:
      cat f - g  Output f's contents, then standard input, then g's contents.
      cat        Copy standard input to standard output.
    
    GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
    For complete documentation, run: info coreutils 'cat invocation'
    
  • more :显示内容,首先显示一个屏幕的内容,如果内容过多,一个屏幕显示不下,需要按Enter 键显示下一行,按Space 显示下一屏的内容,按Ctrl + c 退出。

    命令格式:

    more 文件路径
    

    用法举例,我手套有个人类基因组功能注释文件,很大。

    [cyh@localhost Desktop]$ more gen2go.txt
    9606    1       GO:0003674      ND      enables molecular_function      -       Function
    9606    1       GO:0005576      HDA     located_in      extracellular region    27068509 Component
    9606    1       GO:0005576      IDA     located_in      extracellular region    3458201 Component
    9606    1       GO:0005576      TAS     located_in      extracellular region    -       Component
    9606    1       GO:0005615      HDA     located_in      extracellular space     16502470 Component
    9606    1       GO:0005886      IBA     is_active_in    plasma membrane 21873635        Component
    9606    1       GO:0008150      ND      involved_in     biological_process      -       Process
    9606    1       GO:0031093      TAS     located_in      platelet alpha granule lumen    -Component
    9606    1       GO:0034774      TAS     located_in      secretory granule lumen -       Component
    9606    1       GO:0062023      HDA     located_in      collagen-containing extracellular
    matrix  27559042        Component
    --More--(0%)
    
  • tail :显示文本文件末尾部分,默认显示10行

    命令格式:

    tail [选项] 文件路径
    

    -n 指定显示行数

    用法举例:

    [cyh@localhost Desktop]$ tail gen2go.txt  #默认显示最后10行
    9606    124188214       GO:0003677      IEA     enables DNA binding     -       Function
    9606    124188214       GO:0005634      IEA     located_in      nucleus -       Component
    9606    124188214       GO:0030527      IEA     enables structural constituent of chromatin       -       Function
    9606    124188214       GO:0046982      IEA     enables protein heterodimerization activity       -       Function
    9606    125316803       GO:0005515      IPI     enables protein binding 32958672        Function
    9606    125316803       GO:0005615      IDA     located_in      extracellular space     32958672  Component
    9606    125316803       GO:0005730      IDA     located_in      nucleolus       32958672 Component
    9606    127138866       GO:0003674      ND      enables molecular_function      -       Function
    9606    127138866       GO:0008150      ND      involved_in     biological_process      -Process
    9606    127138866       GO:0016020      IEA     located_in      membrane        -       Component
    [cyh@localhost Desktop]$ tail -n 2 gen2go.txt  #指定显示最后两行
    9606    127138866       GO:0008150      ND      involved_in     biological_process      -Process
    9606    127138866       GO:0016020      IEA     located_in      membrane        -       Component
    [cyh@localhost Desktop]$ tail --help  #查看其他参数及参数详解
    Usage: tail [OPTION]... [FILE]...
    Print the last 10 lines of each FILE to standard output.
    With more than one FILE, precede each with a header giving the file name.
    With no FILE, or when FILE is -, read standard input.
    
    Mandatory arguments to long options are mandatory for short options too.
      -c, --bytes=K            output the last K bytes; or use -c +K to output
                                 bytes starting with the Kth of each file
      -f, --follow[={name|descriptor}]
                               output appended data as the file grows;
                                 an absent option argument means 'descriptor'
      -F                       same as --follow=name --retry
      -n, --lines=K            output the last K lines, instead of the last 10;
                                 or use -n +K to output starting with the Kth
          --max-unchanged-stats=N
                               with --follow=name, reopen a FILE which has not
                                 changed size after N (default 5) iterations
                                 to see if it has been unlinked or renamed
                                 (this is the usual case of rotated log files);
                                 with inotify, this option is rarely useful
          --pid=PID            with -f, terminate after process ID, PID dies
      -q, --quiet, --silent    never output headers giving file names
          --retry              keep trying to open a file if it is inaccessible
      -s, --sleep-interval=N   with -f, sleep for approximately N seconds
                                 (default 1.0) between iterations;
                                 with inotify and --pid=P, check process P at
                                 least once every N seconds
      -v, --verbose            always output headers giving file names
          --help     display this help and exit
          --version  output version information and exit
    
    
  • wc (word count) 显示文件行数,单词数,字节数等

    命令格式:

    wc [选项] 文件列表或目录
    

    -c (character) :显示文件字节数

    -l (line) :显示行数

    -w (word) : 显示单词数

    用法举例:

    [cyh@localhost shiyan1]$ wc -clw sample.txt  #查看文件行数4,单词数9,字节数48
     4  9 48 sample.txt
    [cyh@localhost shiyan1]$ cat sample.txt  #确认文件(第一行什么都没有,没有内容,也是一行)
    
    The linux system is great
    I like it
    2023.07.29
    [cyh@localhost shiyan1]$ wc --help  #查看全部选项详解
    Usage: wc [OPTION]... [FILE]...
      or:  wc [OPTION]... --files0-from=F
    Print newline, word, and byte counts for each FILE, and a total line if
    more than one FILE is specified.  With no FILE, or when FILE is -,
    read standard input.  A word is a non-zero-length sequence of characters
    delimited by white space.
    The options below may be used to select which counts are printed, always in
    the following order: newline, word, character, byte, maximum line length.
      -c, --bytes            print the byte counts
      -m, --chars            print the character counts
      -l, --lines            print the newline counts
          --files0-from=F    read input from the files specified by
                               NUL-terminated names in file F;
                               If F is - then read names from standard input
      -L, --max-line-length  print the length of the longest line
      -w, --words            print the word counts
          --help     display this help and exit
          --version  output version information and exit
    
    GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
    For complete documentation, run: info coreutils 'wc invocation'
    
  • date 查看时间(电脑或服务器系统显示时间),也可以修改系统时间

    举例:

    [cyh@localhost shiyan1]$ date  #2023年7月29号下午十点45分55秒星期六
    Sat Jul 29 10:45:55 EDT 2023
    

    我一般用于查看脚本运行了多少时间,在命令前后各一个,如下

    [cyh@localhost Desktop]$ cat log2.sh  #先查看一下脚本内容
    #!/bin/bash
    echo $(date "+%Y-%m-%d %H:%M:%S")  #显示运行for循环结束前系统时间
    for i in {1,2,3}  #for循环
    do
      echo "I like R "  #循环输出该内容
    done
    echo $(date "+%Y-%m-%d %H:%M:%S")  #显示运行for循环结束后系统时间
    [cyh@localhost Desktop]$ bash log2.sh  #运行脚本,时间太短,
    2023-07-29 10:54:34
    I like R
    I like R
    I like R
    2023-07-29 10:54:34
    [cyh@localhost Desktop]$
    
  • who :列出当前系统的登入用户

    命令格式:

    who [选项]
    

    -q 显示当前所有登录的用户名及当前在线人数

    用法举例:

    [cyh@localhost Desktop]$ who  #我远程登入使用两个窗口,所以有pts/0与pts/1之分
    cyh      :0           2023-07-29 09:56 (:0)
    cyh      pts/0        2023-07-29 09:57 (192.168.1.9)
    cyh      pts/1        2023-07-29 10:10 (192.168.1.9)
    [cyh@localhost Desktop]$ who -q #一个root(cyh),其他是远程登录的不同窗口(可以认为一个账户户不同登入)
    cyh cyh cyh
    # users=3
    [cyh@localhost Desktop]$
    

文本编辑

在看到这里,观众老爷们会问,什么是文本编辑。这个问题好哇!很容易理解,其实就是编辑文本,像word一样,改变文本内容。常用的文本编辑器是vi ,不同的发行版也有其他的文本编辑器,比如:geditEmacsnano 等。我一般使用vimvimvi 的升级版。

vim 编辑器有三种工作模式:命令模式、编辑模式、末行模式。

  • 命令模式

    使用 vi [文件路径] ** 就可以启动vim** 编辑器进入命令模式,文件路径可以指定编辑文件所在位置,如果文件不存在就会创建一个新的文件。使用vi [文件路径] ** 命令后会转调至编辑页面,此时文件还无法输入字符。需要按某个字母就可以进行编辑,并且编辑器最后一行会显示“–INSERT–”** 就表明进入编辑模式可以进行编辑。字母有以下:

    • i :按i 之后就可以在光标当前位置输入字符,并进入编辑模式
    • a :在当前光标的下一个位置开始输入字符,并进入编辑模式
    • /字符串 :该命令非常方便定位在第一个特定字符后。按下**/** 后屏幕底部会出现**/** ,在**/** 号的后面输入你需要搜索的字符,后按Enter 后会从当前位置向尾部搜索,并定位在第一个匹配的字符串旁。非常方便在文字较多的文本。
    • 等等还有好多(自行探索)
  • 编辑模式

    在使用命令模式按相应所需字符后,就可以进入编辑模式,该模式下就可以进行文本编辑。如果需要退出就需要按Esc 键重新回到命令模式

  • 末行模式

    当文本编辑完成后,按Esc 键由编辑模式回到命令模式,在按 号(冒号) 就可以进入末行模式,并在编辑器底部显示 “ : ” ,后面接末行模式下命令提示符,命令提示符如下:

    • w :写入到启动编辑器时你定义的指定路径下的文件中,可以理解为保存文件。
    • q :退出编辑器,会提示你保存更改后文件,如果没有更改文件就不会有提示
    • q! :强制退出编辑器,所编辑的文件全部 保存。
    • wq :保存文本并退出编辑器
    • wq! : 强制性保存文本并退出编辑器

用法举例:

vim /home/cyh/Desktop/sample.txt  #使用该命令后会进入编辑器,进入命令模式
#按命令模式中你所需要的字符,例如 i ,在当前光标位置输入文本,编辑器底部出现--INSERT--,进入编辑模式
# 编辑文本....   编辑后按Esc键,退出编辑模式,进入命令模式,按冒号进入末行模式,编辑器底部出现冒号
#在冒号后输入末行模式你需要的字符后回车,系统按你输入的指令执行

符号、特殊符号、正则表达式、重定向、管道符的使用

该部分是在学习前面部分的进阶。灵活度与难度较大。但勤加练习又很简单

通配符

通配符号有好多种,包括 *、?[ ]-

  • " * " 用于用于表示任意长度的任何字符

用法举例:

[cyh@localhost etc]$ cd /etc/abrt
[cyh@localhost abrt]$ ll
total 12
-rw-r--r--. 1 root root  850 Oct  1  2020 abrt-action-save-package-data.conf
-rw-r--r--. 1 root root 2118 Oct  1  2020 abrt.conf
-rw-r--r--. 1 root root   31 Oct  1  2020 gpg_keys.conf
drwxr-xr-x. 2 root root   95 Mar 12 09:47 plugins
[cyh@localhost abrt]$ ls -l /etc/abrt/*.conf  #查看该文件下以.conf结尾的文件
-rw-r--r--. 1 root root  850 Oct  1  2020 /etc/abrt/abrt-action-save-package-data.conf
-rw-r--r--. 1 root root 2118 Oct  1  2020 /etc/abrt/abrt.conf
-rw-r--r--. 1 root root   31 Oct  1  2020 /etc/abrt/gpg_keys.conf
  • ? 表示任意一个字符,能够更准确的找到忘记文件名有摸棱两可的文件。

    用法举例:

    [cyh@localhost Desktop]$ ll
    total 218464
    -rw-rw-r--. 1 cyh  cyh          0 Jul 11 12:07 first_file.txt
    -rw-rw-r--. 1 cyh  cyh   28788565 Jun 13 04:00 gen2go.txt
    -rw-rw-r--. 1 cyh  cyh  194901303 Jun 13 03:58 gene2go
    -rw-rw-r--. 1 cyh  cyh        124 Jul 29 10:53 log2.sh
    -rw-rw-r--. 1 cyh  cyh        985 Jul  6 09:38 log2.txt
    -rw-r--r--. 1 root root       236 Jul  5 23:12 log.txt
    drwxrwxr-x. 3 cyh  cyh         45 Jul 29 10:09 shiyan1
    drwxrwxr-x. 2 cyh  cyh        246 Jul 13 01:11 shiyan5
    [cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/???.txt
    -rw-r--r--. 1 root root 236 Jul  5 23:12 /home/cyh/Desktop/log.txt
    [cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/????.txt
    -rw-rw-r--. 1 cyh cyh 985 Jul  6 09:38 /home/cyh/Desktop/log2.txt
    [cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/??.txt
    ls: cannot access /home/cyh/Desktop/??.txt: No such file or directory
    [cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/l??.txt
    -rw-r--r--. 1 root root 236 Jul  5 23:12 /home/cyh/Desktop/log.txt
    [cyh@localhost Desktop]$
    

    由上面的结果可以看出,必须是一个问号匹配一个字符。

  • [ ]- 用于指定符号或者是数值的范围, 表示非(相反的)

    用法举例:

    [cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/[a-z]*.*  #显示a到z开头的所有格式的文件
    -rw-rw-r--. 1 cyh  cyh         0 Jul 11 12:07 /home/cyh/Desktop/first_file.txt
    -rw-rw-r--. 1 cyh  cyh  28788565 Jun 13 04:00 /home/cyh/Desktop/gen2go.txt
    -rw-rw-r--. 1 cyh  cyh       124 Jul 29 10:53 /home/cyh/Desktop/log2.sh
    -rw-rw-r--. 1 cyh  cyh       985 Jul  6 09:38 /home/cyh/Desktop/log2.txt
    -rw-r--r--. 1 root root      236 Jul  5 23:12 /home/cyh/Desktop/log.txt
    [cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/[g-k]*.* #显示g到k开头的所有格式的文件
    -rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 /home/cyh/Desktop/gen2go.txt
    [cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/[!g-k]*.* ##显示除g到k开头外的所有格式的文件
    -rw-rw-r--. 1 cyh  cyh    0 Jul 11 12:07 /home/cyh/Desktop/first_file.txt
    -rw-rw-r--. 1 cyh  cyh  124 Jul 29 10:53 /home/cyh/Desktop/log2.sh
    -rw-rw-r--. 1 cyh  cyh  985 Jul  6 09:38 /home/cyh/Desktop/log2.txt
    -rw-r--r--. 1 root root 236 Jul  5 23:12 /home/cyh/Desktop/log.txt
    [cyh@localhost Desktop]$
    
特殊符号

特殊字符有:分号(; )、& 、转义字符( \ )、输入重定向(< 、<< )、输出重定向(>、>> )、管道符 (| )等

  • 分号(;

    当需要连续运行几条命令并且不想写脚本时,这是命令之间就可以使用分号( ; )隔开,且命令是连续运行的,输出结果是连续运行后的输出结果。

    举例如下:

    [cyh@localhost Desktop]$ ll  #先查看以下桌面的文件
    total 218464
    -rw-rw-r--. 1 cyh  cyh          0 Jul 11 12:07 first_file.txt
    -rw-rw-r--. 1 cyh  cyh   28788565 Jun 13 04:00 gen2go.txt
    -rw-rw-r--. 1 cyh  cyh  194901303 Jun 13 03:58 gene2go
    -rw-rw-r--. 1 cyh  cyh        124 Jul 29 10:53 log2.sh
    -rw-rw-r--. 1 cyh  cyh        985 Jul  6 09:38 log2.txt
    -rw-r--r--. 1 root root       236 Jul  5 23:12 log.txt
    drwxrwxr-x. 3 cyh  cyh         45 Jul 29 10:09 shiyan1
    drwxrwxr-x. 2 cyh  cyh        246 Jul 13 01:11 shiyan5
    [cyh@localhost Desktop]$ cd ~  #返回到根目录
    [cyh@localhost home]$ cd /home;cd cyh;cd Desktop;cd shiyan1  #使用分号连续执行命令
    [cyh@localhost shiyan1]$  #返回结果,目录更该到了shiyan1
    
正则表达式

正则表达式是一种由特定语法规则定义的模式匹配工具。 在Linux系统中,正则表达式常用于文本处理、日志分析、配置文件修改等任务。 Linux系统中最常见的正则表达式工具是grep、sed和awk。

以下是部分符号含义:

元字符作用
*前一个字符匹配0次或任意多次。
.匹配除了换行符外的任意一个字符。
+匹配前面的子表达式一次或多次。
?匹配前面的子表达式0次或一次。
^匹配行首。例如:^hello会匹配以hello开头的行。
$匹配行尾。例如:hello&会匹配以hello结尾的行。
[]匹配中括号中指定的任意一个字符,只匹配一个字符。例如:[aoeiu]匹配任意一个元音字母;[0-9]匹配任意一位数字;[a-z][0-9]匹配小写字母和一位数字组成的两位字符。
[^]匹配除中括号中字符以外的任意一个字符。例如:[0-9]匹配任意一位非数字字符;[a-z]匹配任意一位非小写字母。
\转义符。用于取消特殊符号的含义。
{n}表示其前面的字符恰好出现n次。例如:[0-9]{4}匹配任意4位数字,[1][3-8][0-9]{9}匹配手机号码。
{n,}表示其前面的字符出现不小于n次。例如:[0-9]{2,}表示两位及其以上的数字。
{n,m}表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]{6,8}匹配6到8位的小写字母。
[[:XXX:]]grep工具预定义的一些类,如[[:alpha:]]匹配一个字母。

懒得举例了:看这位博主得吧:Linux操作:正则表达式 - 知乎 (zhihu.com)

重定向
  • 输入重定向(< 、<< )、输出重定向(>、>>

    一、

    输出重定向(>、>> )定向添加某些内容到某地(某文件),可以与echo 命令搭配使用

    > 定向添加某些内容到某地(某文件),方式是覆盖输入,就是源文件内容会被覆盖

    >> 定向添加某些内容到某地(某文件),方式是在文件末尾加入

    例如:

    添加内容:I like Linux system 到桌面上 shiyan1 文件夹中 sample.txt 文件中

    1、末尾加入,使用 **>> ** , 请谨慎使用,执行前务必检查

    [cyh@localhost shiyan1]$ pwd  #查看当前目录
    /home/cyh/Desktop/shiyan1
    [cyh@localhost shiyan1]$ ll  #检查是否含有sample.txt文件
    total 4
    -rw-rw-r--. 1 cyh cyh 48 Jul 29 10:09 sample.txt
    drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
    [cyh@localhost shiyan1]$ cat sample.txt  #先查看以下sample.txt里面的内容
    
    The linux system is great
    I like it
    2023.07.29
    [cyh@localhost shiyan1]$ echo "I like Linux system" >>./sample.txt #添加指定内容
    [cyh@localhost shiyan1]$ cat sample.txt #查看是否添加了指定内容
    
    The linux system is great
    I like it
    2023.07.29
    I like Linux system
    [cyh@localhost shiyan1]$
    

    2、覆盖加入(全部覆盖掉),使用 >请谨慎使用,执行前务必检查

    [cyh@localhost shiyan1]$ echo "I like Linux system" >./sample.txt
    [cyh@localhost shiyan1]$ cat sample.txt
    I like Linux system
    

    3、多文件合并

    使用多文件合并可以使用cat 命令。

    [cyh@localhost shiyan1]$ ll  #先查看文件内容(非必须)
    total 16
    -rw-rw-r--. 1 cyh cyh 80 Aug 17 05:14 cdx.sh
    -rw-rw-r--. 1 cyh cyh 94 Aug 17 21:26 ne.txt
    -rw-rw-r--. 1 cyh cyh 20 Aug 17 04:52 sample.txt
    drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
    -rw-rw-r--. 1 cyh cyh 14 Aug 17 05:14 z
    [cyh@localhost shiyan1]$ cat sample.txt > ne.txt #将sample.txt的内容定向覆盖输入到ne.txt文件中
    [cyh@localhost shiyan1]$ cat sample.txt #查看sample.txt文件内容
    I like Linux system
    [cyh@localhost shiyan1]$ cat ne.txt  #查看覆盖后的ne.txt文件内容
    I like Linux system
    [cyh@localhost shiyan1]$ cat cdx.sh  #查看cdx.sh内容
    #!/bin/bash
    z=3
    cat ne.txt > z
    while read z
    do
    echo "the number is ${z} "
    done
                                 #这行是空的,无内容
    [cyh@localhost shiyan1]$ cat cdx.sh sample.txt >> ne.txt #将两个文件按先后顺序在ne.txt文件末尾加入,结果显示,输入的两个文件只要是cat能看的都可以
    [cyh@localhost shiyan1]$ cat ne.txt  #查看结果
    I like Linux system
    I like Linux system
    #!/bin/bash
    z=3
    cat ne.txt > z
    while read z
    do
    echo "the number is ${z} "
    done
    
    I like Linux system
    [cyh@localhost shiyan1]$
    

    二、

    输入重定向(< 、<< )。和输出相似。

    用法举例:

    [cyh@localhost shiyan1]$ cat < ne.txt  #将文件内容重定向入cat查看。
    1
    2
    6
    7
    23
    99
    [cyh@localhost shiyan1]$ cat << stop >ne.txt #键盘输入内容,以stop为终止关键字,定向入cat,定向输入到ne.txt文件(覆盖输入)
    > The linux is great
    > I like it
    > stop  #结束关键字,在这个之前的内容会被覆盖输入
    [cyh@localhost shiyan1]$ cat ne.txt  #查看结果
    The linux is great
    I like it
    [cyh@localhost shiyan1]$ cat << end >> ne.txt #同上,在末尾加入
    > hallo 
    > hi
    > end
    [cyh@localhost shiyan1]$ cat ne.txt   #查看结果
    The linux is great
    I like it
    hallo
    hi
    [cyh@localhost shiyan1]$ cat << lalala >>ne.txt #以lalala结尾
    > hhhhhhhhhhhhh
    > llllllllllll
    > lelelelalala lalala    #这行也有个lalala字符串,但是并没有结束输入
    > lalala   #从输入内容来看,关键字必须占新的一行,否者无法识别
    

    总结:输入输出方面,搞清楚输入输出方向。例如,在举个例子:

    [cyh@localhost shiyan1]$ echo "" >ne.txt #将文件里的内容删除(第一行不为空,只是没有内容)
    [cyh@localhost shiyan1]$ cat ne.txt #查看文件
    
    [cyh@localhost shiyan1]$ ll  #找一下文件,举个例子
    total 16
    -rw-rw-r--. 1 cyh cyh 80 Aug 17 05:14 cdx.sh
    -rw-rw-r--. 1 cyh cyh  1 Aug 17 21:44 ne.txt
    -rw-rw-r--. 1 cyh cyh 20 Aug 17 04:52 sample.txt
    drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
    -rw-rw-r--. 1 cyh cyh 14 Aug 17 05:14 z
    [cyh@localhost shiyan1]$ cat < cdx.sh >ne.txt #将cdx.sh内容重定向入cat命令,定向输出到ne.txt
    [cyh@localhost shiyan1]$ cat ne.txt #查看结果
    #!/bin/bash
    z=3
    cat ne.txt > z
    while read z
    do
    echo "the number is ${z} "
    done
    
    [cyh@localhost shiyan1]$
    

    错误输出重定向

    > 前面加一个2,可以将命令执行过程产生的错误信息于结果区分开来,但都是输出在总端上,因此可以使用重定向输入到文件中保存。

    举例:

    [cyh@localhost shiyan1]$ ll  #查看以下有哪些文件
    total 16
    -rw-rw-r--. 1 cyh cyh 80 Aug 17 05:14 cdx.sh
    -rw-rw-r--. 1 cyh cyh 80 Aug 17 21:45 ne.txt
    -rw-rw-r--. 1 cyh cyh 20 Aug 17 04:52 sample.txt
    drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
    -rw-rw-r--. 1 cyh cyh 80 Aug 17 21:55 z
    [cyh@localhost shiyan1]$ cat cdx1.sh 2> error.txt  #该命令会报错,因为没有这个文件,将信息输入到error.txt文件
    [cyh@localhost shiyan1]$ cat error.txt  #查看文件内容,是报错提示信息
    cat: cdx1.sh: No such file or directory
    [cyh@localhost shiyan1]$ ll /home/cyh 2>> error.txt #附加重定向,运行后结果在屏幕输出
    total 4
    drwxr-xr-x. 4 cyh cyh 137 Jul 29 10:53 Desktop
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Documents
    drwxr-xr-x. 3 cyh cyh  19 Mar 15 11:03 Downloads
    -rw-rw-r--. 1 cyh cyh 359 Jun  1 01:05 guss.sh
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Music
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Pictures
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Public
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Templates
    drwxrwxr-x. 2 cyh cyh  42 Apr  7 07:50 test1
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Videos
    [cyh@localhost shiyan1]$ cat error.txt  #结果显示,并没有输入在文件中,为什么???因为2表示的是将错误信息输入到文件中,上步命令并没有报错,所以并不会在文件中添加任何信息
    cat: cdx1.sh: No such file or directory
    

    那么,我们需要将屏幕输出结果于错误信息都输出到某文件,又该如何操作呢??这是后我们就需要改一下命令,如下:

    [cyh@localhost shiyan1]$ ll /home/cyh > error.txt 2>&1 #将屏幕输出结果定向入error.txt文件。并且错误信息也可以输入
    [cyh@localhost shiyan1]$ cat error.txt
    total 4
    drwxr-xr-x. 4 cyh cyh 137 Jul 29 10:53 Desktop
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Documents
    drwxr-xr-x. 3 cyh cyh  19 Mar 15 11:03 Downloads
    -rw-rw-r--. 1 cyh cyh 359 Jun  1 01:05 guss.sh
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Music
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Pictures
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Public
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Templates
    drwxrwxr-x. 2 cyh cyh  42 Apr  7 07:50 test1
    drwxr-xr-x. 2 cyh cyh   6 Mar 12 10:18 Videos
    [cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>&1 #cyh1文件是没有的
    [cyh@localhost shiyan1]$ cat error.txt  #将错误信息成功输入到文件
    ls: cannot access /home/cyh1: No such file or directory
    

    到这里我们据可以发现为什么没有附加重定向呢?上述代码是不是又两个 > 呢?那怎么操作呢??

    看到这里,我们应该了解了。一个 > 是覆盖,两个是末尾附加,那么应该该哪一个呢?我们举例试一下就知道了:

    [cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>&1  #先生成一个结果
    [cyh@localhost shiyan1]$ cat error.txt #查看一些错误信息,预期结果,没有问题
    ls: cannot access /home/cyh1: No such file or directory
    [cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>>&1  #我们修改后面为两个>号
    -bash: syntax error near unexpected token `&'  #报错,没有&这个东西
    [cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>>1 #我们删掉&
    [cyh@localhost shiyan1]$ cat error.txt #查看结果,结果没有,整个文件为空,所以不行
    [cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>&1  #我们修改前面的,先把结果生成一个进去,更好展示
    [cyh@localhost shiyan1]$ ll /home/cyh1 >> error.txt 2>&1 #修改前面的
    [cyh@localhost shiyan1]$ cat error.txt #展示结果,符合预期,所以我们秩序记住,在文件前面的才是重定向的
    ls: cannot access /home/cyh1: No such file or directory
    ls: cannot access /home/cyh1: No such file or directory
    
  • & 用于后台执行命令,当执行文件需要一定时间时,我们可以挂在后台执行,当前总端就可以执行其他任务。我一般会搭配nohup 使用

    举例如下:

    [cyh@localhost shiyan1]$ cat cdx.sh & #在结尾加一个& 后台运行,不好用
    [1] 3655    #进程号(ID)
    [cyh@localhost shiyan1]$ #!/bin/bash
    z=3
    cat ne.txt > z
    while read z
    do
    echo "the number is ${z} "
    done
    
    ^C      #按Ctrl+c结束,不好用
    [1]+  Done                    cat cdx.sh
    [cyh@localhost shiyan1]$ nohup bash cdx.sh &  #加一个nohup
    [1] 3695
    [cyh@localhost shiyan1]$ nohup: ignoring input and appending output to ‘nohup.out’   #它说日志文件输出在‘nohup.out’中
                          #这里按一个回车
    [1]+  Done                    nohup bash cdx.sh
    [cyh@localhost shiyan1]$ ll  #我们查看一下是否有‘nohup.out’文件
    total 20
    -rw-rw-r--. 1 cyh cyh  80 Aug 17 05:14 cdx.sh
    -rw-rw-r--. 1 cyh cyh  80 Aug 17 21:45 ne.txt
    -rw-------. 1 cyh cyh 137 Aug 17 21:55 nohup.out   #在这里
    -rw-rw-r--. 1 cyh cyh  20 Aug 17 04:52 sample.txt
    drwxrwxr-x. 3 cyh cyh  21 Jul 29 09:59 shiyan_feikng
    -rw-rw-r--. 1 cyh cyh  80 Aug 17 21:55 z
    [cyh@localhost shiyan1]$ cat nohup.out  #查看以下内容
    #!/bin/bash
    z=3
    cat ne.txt > z
    while read z
    do
    echo "the number is ${z} "
    done
    
    cdx.sh: line 4: read: read error: 0: Bad file descriptor
    [cyh@localhost shiyan1]$ #总结:不好用
    

    到这里,我一般会重定向与 & 搭配使用,在这里举一个转录组序列比对的例子:

    脚本内容:

    #!/bin/bash
    #maker:YongHongChen
    #date:2023-04-24
    #This script used to match sequence by hisat2
    #the "GRCh38_index" is index file which contain "*.1.ht2" "*2.ht2" ... "*.8.ht2"
    #" -p 3 " is thread
    #" -1 " input one file;" -2 " input second file;their are can use .fa.gz/.fq format,their were all trimed
    #" -S " is a output option that it will generate .sam format file
    # Attention: the sam file is so big,if you input 1G .fq file,it will generate about 10G result
    a=1
    b=2
    echo $(date "+%Y-%m-%d %H:%M:%S") #This command is uesd to generate the current time
    for i in {1,2,3}
    do
      echo "ly${i}_${a} and ly${i}_${b} are begin"
      hisat2 -p 3 /home/cyh/Desktop/hugene_dir/GRCh38_index -1 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${a}_paired.fq.gz -2 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${b}_paired.fq.gz -S /home/cyh/rna_seq1/hisat2_ed1/ly${i}_mached.sam
      echo "ly${i}_${a} and ly${i}_${b} are finish"
      echo "NT${i}_${a} and NT${i}_${b} are begin"
      hisat2 -p 3 /home/cyh/Desktop/hugene_dir/GRCh38_index -1 /home/cyh/rna_seq1/trimmomatic_ed1/NT${i}_${a}_paired.fq.gz -2 /home/cyh/rna_seq1/trimmomatic_ed1/NT${i}_${b}_paired.fq.gz -S /home/cyh/rna_seq1/hisat2_ed1/NT${i}_mached.sam
      echo "NT${i}_${a} and NT${i}_${b} are finish"
    done
    echo "All complete"
    echo $(date "+%Y-%m-%d %H:%M:%S") 
    

    执行脚本:

    [cyh@localhost shiyan1]$ nuhup bash hisat2.sh >hisat2.txt 2>&1
    

    将所有信息全部输入hisat2.txt文件,包括总端输出信息以及错误信息。

  • 管道符

    管道符 | ,可以把一系列命令连接起来,把前一个命令的输出结果作为输入输给后面的一个命令,一个接一个。如果你接触过 R 语言中的 %>% 就非常号理解。

    用法举例:

    [cyh@localhost shiyan1]$ cd /home/cyh/Desktop #更改当前目录
    [cyh@localhost Desktop]$ ll #查看当前目录
    total 218464
    -rw-rw-r--. 1 cyh  cyh          0 Jul 11 12:07 first_file.txt
    -rw-rw-r--. 1 cyh  cyh   28788565 Jun 13 04:00 gen2go.txt
    -rw-rw-r--. 1 cyh  cyh  194901303 Jun 13 03:58 gene2go
    -rw-rw-r--. 1 cyh  cyh        124 Jul 29 10:53 log2.sh
    -rw-rw-r--. 1 cyh  cyh        985 Jul  6 09:38 log2.txt
    -rw-r--r--. 1 root root       236 Jul  5 23:12 log.txt
    drwxrwxr-x. 3 cyh  cyh        123 Aug 17 22:54 shiyan1
    drwxrwxr-x. 2 cyh  cyh        246 Jul 13 01:11 shiyan5
    [cyh@localhost Desktop]$ cat gen2go.txt | more #使用管道符,将文件的内容more一下
    9606    1       GO:0003674      ND      enables molecular_function      -       Function
    9606    1       GO:0005576      HDA     located_in      extracellular region    27068509 Component
    9606    1       GO:0005576      IDA     located_in      extracellular region    3458201 Co
    mponent
    9606    1       GO:0005576      TAS     located_in      extracellular region    -       Co
    mponent
    9606    1       GO:0005615      HDA     located_in      extracellular space     16502470 Component
    9606    1       GO:0005886      IBA     is_active_in    plasma membrane 21873635        Co
    mponent
    9606    1       GO:0008150      ND      involved_in     biological_process      -       Pr
    ocess
    9606    1       GO:0031093      TAS     located_in      platelet alpha granule lumen    -Component
    9606    1       GO:0034774      TAS     located_in      secretory granule lumen -       Co
    mponent
    9606    1       GO:0062023      HDA     located_in      collagen-containing extracellular
    matrix  27559042        Component
    --More
    

    脚本内容举例:(不要在乎是否看懂)脚本将序列比对软件(hisat2 )生成的结果 sam 文件给 samtools 排序并转换为 bam 文件。

    #!/bin/bash
    #maker:YongHongChen
    #date:2023-04-24
    a=1
    b=2
    echo $(date "+%Y-%m-%d %H:%M:%S") #This command is uesd to generate the current time
    for i in {1,2,3}
    do
      echo "ly${i}_${a} and ly${i}_${b} are begin"
      hisat2 -p 3 /home/cyh/Desktop/hugene_dir/GRCh38_index -1 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${a}_paired.fq.gz -2 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${b}_paired.fq.gz -S | samtools sort -@ 20 -o /home/chyh/rna_seq1/samtools_result/ly${i}.bam /home/cyh/rna_seq1/hisat2_ed1/ly${i}_mached.sam
      echo "ly${i}_${a} and ly${i}_${b} are finish"
    done
    echo "All complete"
    echo $(date "+%Y-%m-%d %H:%M:%S") 
    

Linux编写脚本

在这之前,我举例过几个脚本的例子,UU们可能疑惑不知怎么写,那么接下来,我们看看脚本编写,这里我们只用 bash ,不用perl 举例。对 perl 感兴趣的去看其他大佬的文章。

在运行脚本前,我们得又一个脚本文件(这里以 .sh 文件举例)。

1、创建脚本文件

  • 你可以先创建文件再编写
[cyh@localhost shiyan1]$ touch frist_script.sh  #先创建脚本
[cyh@localhost shiyan1]$ ll   #查看一下是否创建成功
total 0
-rw-rw-r--. 1 cyh cyh  0 Aug 17 23:16 frist_script.sh
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
[cyh@localhost shiyan1]$ vim frist_script.sh  #编写脚本
  • 直接使用vim ,如果没有文件会自动创建(推荐)
vim frist_script.sh  #创建并编写脚本

2、编写脚本与文本编辑操作一样,直接参考前面得,这里不加以描述。

3、编写内容

  • 首行内容

如果你编写得是 .sh 的文件,那么就由 bash 执行,如果是 .pl 文件,那么就由 perl 执行。第一行必须是编译方式的描述,并且格式固定

#!/bin/sh

#!/bin/bash

如果是 perl

#!/bin/perl  或 #!/usr/bin/perl  #perl解释器路径

其他内容写你需要的命令。

脚本举例:(for循环后面讲)

#!/bin/bash  #如何是bash的第一行必须为这个,或者可以写成 #!/bin/sh
#maker:YongHongChen   #创建者名 (非必须,有最好)
#date:2023-04-24       #创建时间(非必须,有最好)
a=1
b=2
echo $(date "+%Y-%m-%d %H:%M:%S") #This command is uesd to generate the current time
for i in {1,2,3}
do
  echo "ly${i}_${a} and ly${i}_${b} are begin"
  hisat2 -p 3 /home/cyh/Desktop/hugene_dir/GRCh38_index -1 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${a}_paired.fq.gz -2 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${b}_paired.fq.gz -S | samtools sort -@ 20 -o /home/chyh/rna_seq1/samtools_result/ly${i}.bam /home/cyh/rna_seq1/hisat2_ed1/ly${i}_mached.sam
  echo "ly${i}_${a} and ly${i}_${b} are finish"
done
echo "All complete"
echo $(date "+%Y-%m-%d %H:%M:%S") 
  • 非首行内容

    非首行内容写你需要的命令。(注释除外,注释使用 # 号)

    上述脚本中含有变量 ab ,后面再讲,如果学过 C或python ,那就很好理解了

4、执行脚本

bash frist_script.sh #bash 脚本文件
perl frist_script.pl #perl脚本

如果弹出没有权限执行,则给予权限

chmod u+x frist_script.sh  #设置可执行权限

注意:执行脚本本身就可以当作执行一条命令,所以脚本里面套一个脚本是可以的。

脚本进阶

编写脚本内容之前,我们需要了解一些基础知识。

一、变量

变量有环境变量与内部变量,环境变量可以理解为整个系统下的默认的变量,在整个系统下通用的变量,是在命令行定义的变更,举个例子:我在终端写 a=3 那么不在重启前,不改变数值前 a=3 。类似于C语言函数外的变量。

变量的定义注意事项(大多编程语言都是这样)

  • 变量名称可以由字母、数字和下划线组成,但不能以数字开头。
  • 在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
  • 变量用等号连接值,等号左右两侧不能有空格。
  • 变量的值如果有空格,需要使用单引号或双引号包括。
  • 在变量的值中,可以使用“\”转义符。
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过,变量需要用双引号包含“ 变量名”或用 变量名”或用 变量名或用{变量名}包含。
  • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
  • 环境变量名建议大写,便于区分。
参数变量作用
$nN 为数字,$0 代表命令本身,$1- 9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}。
$*这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体。
$@这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待。
$#这个变量代表命令行中所有参数的个数。

当我们定义了变量后,就需要取它的值,我们使用$ 取值,例如:$a 取变量a的值

$ 用法有$ 、“$”、$0、 1 、 1、 1n、$ #、$ @、$ *、$ ?、$ ()、、$ {}、$ {#}、$ []、$ -、$ !、$$ 等

上面常用的有 , , ,{},$[] ,用于取值。

$ [] 中括号里写的是表达式,$ () 里写的是命令,$? 判断上一个命令是否运行成功。例如:

[cyh@localhost Desktop]$ echo $[5+6]
11
[cyh@localhost Desktop]$ echo $(seq 2 10)
2 3 4 5 6 7 8 9 10
[cyh@localhost Desktop]$ echo $?  #判断上一条命令是否执行成功,返回0表示成功
0
[cyh@localhost Desktop]$ lll
bash: lll: command not found...
[cyh@localhost Desktop]$ echo $?   #返回非0表示失败,返回值0-255,超出部分%256取余
127
[cyh@localhost Desktop]$

内部变量理解为局部变量,脚本中的变量,脚本中的变量不会影响终端中的变量,在C语言中全局变量不会受到局部变量影响。

[cyh@localhost shiyan1]$ a=0    #全局变量,我定义了一个变量a,它的值为0
[cyh@localhost shiyan1]$ echo $a  #我们可以使用echo输出值
0
[cyh@localhost shiyan1]$ cat frist_script.sh
#!/bin/bash
a=1         #脚本中的局部变量
a1=2        #定义变量a1
echo "a=$a"
echo "a1=$a1"   #输出变量a1的值,注意需要使用$符号取值
echo "a3=$a3"    #这个a3是没有定义的,所以预计会输出空值
[cyh@localhost shiyan1]$ bash frist_script.sh  #执行脚本
a=1
a1=2
a3=
[cyh@localhost shiyan1]$ echo $a  #执行脚本后全局变量值未改变
0
[cyh@localhost shiyan1]$ echo $a1  #找不到脚本局部变量值,没有被定义的变量为空

[cyh@localhost shiyan1]$

变量只要是赋予它值就一定会改变变量值吗?

不一定,只读变量就不可以随意改变值,只读变量只能查看,不能更改,那么要改变值,咋办??只能重启。

[cyh@localhost Desktop]$ readonly a="tai ku la"  #设置只读变量
[cyh@localhost Desktop]$ echo $a   #输出a值
tai ku la
[cyh@localhost Desktop]$ a="na zheng shi tai ku la"  #更改a值,发现报错
-bash: a: readonly variable
[cyh@localhost Desktop]$
二、字符串

字符串就是一串字符,一个英文句子就是一个字符串,要输出字符串,我们需要用引号包起来。

[cyh@localhost shiyan1]$ echo "I like Linux"
I like Linux
  • 字符串截取 expr substr

    从某位置截取指定长度的字符

    [cyh@localhost shiyan1]$ expr substr "I like linux" 2 7  #从第二个位置,截取长度为7的子字符,注意空格也占一个位置
     like l
    
  • 字符串定位 expr index

    在字符串中查找某元素,返回位置。

    [cyh@localhost shiyan1]$ expr index "I like linux" ik   #在字符串中查找ik,返回的位置
    4
    [cyh@localhost shiyan1]$ expr index "I like linux" o  #若没有找到,返回0
    0
    
  • 字符串匹配 expr macth

    两个字符串,后一个在前一个匹配。默认从起始位置匹配,没有匹配到就返回0值,匹配到就返回能匹配的字符个数

    [cyh@localhost shiyan1]$ expr match "I like linux" " li"  
    0
    [cyh@localhost shiyan1]$ expr match "I like linux" "I li"
    4
    [cyh@localhost shiyan1]$ expr match "I like linux" "I lig"  #元素得一样,否者不能匹配
    0
    
  • 计算字符长度 expr length

    返回长度数值,一个字符算一个,空格也算

    [cyh@localhost shiyan1]$ expr length "I like linux"
    12
    
三、函数

$变量名 表示取值。

分支选择结构
  • if 条件语句

说人话就是C语言中得 if 条件语句等

shell 脚本定义格式如下:

写法一:

if [ 条件表达式 ];then
	命令1
elif [ 条件表达式 ];then
	命令2
else
	命令3
fi                       #fi 是if反过来写

写法二:

if [ 条件表达式 ]
then
	命令1
elif [ 条件表达式 ]
then
	命令2
else
	命令3
fi

这是多条件分支。也有单个的。如果学过C语言,那就不难了。

if [ 条件表达式 ]
then
	命令1
fi

注意:if 后面有个空格,中括号里与条件表达式之间前后有空格,不然会报错。

到这里,UU们蠢蠢欲动了,但是有个问题?条件表达式些啥呢?

接下来我们看看条件表达式,很明显,就是一个式子。

  • 字符串比较

    这一部分,是用来比较字符与字符串的

    =比较两个字符是否相等
    !=比较两个字符是否不相等
    < 或 >比较两个字符串长度
    -n判断字符串长度是否大于0
    -z判断字符串长度是否等于0

    用法举例:

    [cyh@localhost shiyan1]$ vim frist_script.sh  #编写脚本
    [cyh@localhost shiyan1]$ cat frist_script.sh  #看一下脚本内容
    #!/bin/bash
    a="I like linux"
    b="I like linua"
    c="like"
    if [ a!=b ]
    then
            echo "a=b"
    elif [ a!=c ]
    then
            echo "a!=c"
    fi
    if [ a>b ]
    then
            echo "a>b"
    fi
    if [ -n a ]
    then
            echo "a length > 0"
    fi
    [cyh@localhost shiyan1]$ bash frist_script.sh  #执行脚本
    a=b
    a>b
    a length > 0
    [cyh@localhost shiyan1]$
    
  • 数值比较

    这一部分是数值的比较

    -eq比较两个数是否相等
    -ge比较一个数是否大于或等于另一个数
    -le比较一个数是否小于或等于另一个数
    -gt比较一个数是否大于另一个数
    -lt比较一个数是否小于另一个数
    -ne比较两个数是否不相等

    用法举例:

    [cyh@localhost shiyan1]$ vim frist_script_number.sh  #编写脚本
    [cyh@localhost shiyan1]$ cat frist_script_number.sh  #查看脚本内容
    #!/bin/bash
    a=1
    b=2
    c=1
    d=3
    if [ $a -eq $b ]    #判断等于 
    then
            echo "a=b"
    else
            echo "a!=b"
    fi
    if [ $d -gt $b ]   #判断大于
    then
            echo "d>b"
    else
            echo "d<b"
    fi
    if [ $d -lt $c ]   #判断小于
    then
            echo "d<c"
    else
            echo "d>c"
    fi
    if [ $a -ne $c ]   #判断不相等
    then
            echo "a!=c"
    else
            echo "a=c"
    fi
    [cyh@localhost shiyan1]$ bash frist_script_number.sh  #执行脚本
    a!=b
    d>b
    d>c
    a=c
    [cyh@localhost shiyan1]$
    
  • 文件属性判断

    该部分用于判断文件属性

    -d确定文件是否为目录
    -f确定文件是否为普通文件
    -e确定文件是否存在
    -r确定是否对文件设置读许可
    -w确定是否对文件设置写许可
    -x确定是否对文件设置执行许可
    -s确定文件名是否具有大于零的长度

    用法举例:

    [cyh@localhost shiyan1]$ ll  #查看当前目录文件内容
    total 8
    -rw-rw-r--. 1 cyh cyh   0 Aug 18 04:51 b
    -rw-rw-r--. 1 cyh cyh 291 Aug 18 05:03 frist_script_number.sh
    -rw-rw-r--. 1 cyh cyh 193 Aug 18 04:51 frist_script.sh
    drwxrwxr-x. 3 cyh cyh  21 Jul 29 09:59 shiyan_feikng
    [cyh@localhost shiyan1]$ vim diff_file.sh   #创建编写脚本
    [cyh@localhost shiyan1]$ cat diff_file.sh    #查看脚本内容
    #!bin/bash
    a="/home/cyh/Desktop/shiyan1/diff_file.sh"
    b="/home/cyh/Desktop/shiyan1/file.txt"
    if [ -d $a ]        #$a表示取a的值
    then
            echo "$a is not a directory"
    else
            echo "$a is a file"
    fi
    if [ -e $b ]
    then
            echo "file.txt had exist"
    else
            echo "file.txt not find"
    fi
    if [ -r $a ]
    then
            echo "the diff_file.sh is readable"
    else
            echo "the diff_file.sh is not readable"
    fi
    [cyh@localhost shiyan1]$ bash diff_file.sh   #执行脚本,并返回结果
    /home/cyh/Desktop/shiyan1/diff_file.sh is a file
    file.txt not find
    the diff_file.sh is readable
    
  • 逻辑操作符

    逻辑操作符常见的主要有 &&||! ,就是或与非啦!这部分内容与C语言 中的类似。

    在这之前,我们接触了单个 & ,与单 个 | ,在这部分我们可以联系起来。

    & 表示任务在后台执行

    && 表示前一条命令执行成功时,才执行后一条命令 。

    [cyh@localhost Desktop]$ ll  #查询目录内容
    total 218464
    -rw-rw-r--. 1 cyh  cyh          0 Jul 11 12:07 first_file.txt
    -rw-rw-r--. 1 cyh  cyh   28788565 Jun 13 04:00 gen2go.txt
    -rw-rw-r--. 1 cyh  cyh  194901303 Jun 13 03:58 gene2go
    -rw-rw-r--. 1 cyh  cyh        124 Jul 29 10:53 log2.sh
    -rw-rw-r--. 1 cyh  cyh        985 Jul  6 09:38 log2.txt
    -rw-r--r--. 1 root root       236 Jul  5 23:12 log.txt
    drwxrwxr-x. 3 cyh  cyh        109 Aug 19 05:12 shiyan1
    drwxrwxr-x. 2 cyh  cyh        246 Jul 13 01:11 shiyan5
    [cyh@localhost Desktop]$ cat log2.sh && echo "good"  #查看已有的文件后输出good
    #!/bin/bash
    echo $(date "+%Y-%m-%d %H:%M:%S")
    for i in {1,2,3}
    do
      echo "I like R "
    done
    echo $(date "+%Y-%m-%d %H:%M:%S")
    good
    [cyh@localhost Desktop]$ cat log22.sh && echo "good"  #文件不存在,即无法执行echo
    cat: log22.sh: No such file or directory
    [cyh@localhost Desktop]$
    

    | 表示管道,上一条命令的输出,作为下一条命令参数(输入)

    [cyh@localhost ~]$ echo "I like linux" | wc -l
    1
    

    || 表示上一条命令执行失败后,才执行下一条命令

    [cyh@localhost Desktop]$ cat log22.sh || echo "good"  #执行失败后执行输出good
    cat: log22.sh: No such file or directory
    good
    
  • case 语句

    该语句类似于C 语言中的switch 语句,case 只能判断一种条件。

    格式如下:

    case    $变量名    in
    	“值1”)
    		如果变量的值等于值1,则执行此程序1
    		;;          #注意两个分号结尾一个语句
    	… … … …
    	*)
    		如果变量的值都不是以上的值,则执行此程序
    		;;
    esac         #倒过来写结束程序
    

    举例如下:

    [cyh@localhost Desktop]$ vim case.sh  #编写脚本
    [cyh@localhost Desktop]$ cat case.sh    #查看脚本
    #!/bin/bash
    read -p "please input number:" -t 30 number  #使用read 从键盘输入一个数给变量number
    case $number in
            "20")
            echo "you input number is 20" ;;
            "30")
            echo "you input number is 30" ;;
            *)
            echo "you input number is other" ;;
    esac
    [cyh@localhost Desktop]$ bash case.sh  #执行脚本
    please input number:30
    you input number is 30
    [cyh@localhost Desktop]$ bash case.sh  #输入数据50
    please input number:50
    you input number is other
    

    分支语句还有许多,但大多不常用。

循环语句
  • for循环

    与其他编程语言类似。

    写法格式一:

    for 变量 in 值1 值2 值3…
    do
    	语句
    done
    

    写法格式二:

    #for ((变量赋值;测试条件表达式;迭代过程))
    for ((i=1;i<=10;i++)) #该写法与C类似,但是注意有两个括号,括号里的数值只是举例,i为变量名
    do
    	语句
    done
    
    for ((i=1;i<=10;i++));do 语句;done  #如果这样写注意分号
    

    写法三:

    for 变量名 in {值1,值2,值3…}  #使用大括号将取值括起来,并用逗号隔开
    do
    	语句
    done
    

    举例:(脚本)

    #!/bin/bash
    #maker:YongHongChen
    #date:2023-07-08
    #This script used to match sequence by hisat2
    #the "GRCh38_index" is index file which contain "*.1.ht2" "*2.ht2" ... "*.8.ht2"
    #" -p 3 " is thread
    #" -1 " input one file;" -2 " input second file;their are can use .fa.gz/.fq format,their were all trimed
    #" -S " is a output option that it will generate .sam format file
    # Attention: the sam file is so big,if you input 1G .fq file,it will generate about 10G result
    a=1
    b=2
    echo $(date "+%Y-%m-%d %H:%M:%S")  #打印当前时间
    for i in {1,2,3}  #取值我使用括号括起,表示从括号里面取值
    do
      echo "ly${i}_${a} and ly${i}_${b} are begin"
      hisat2 -p 20 --dta -x /home/chenyh/ly_NT_RNAseq/reference_GRCh38/GRCh38_index -1 /home/chenyh/ly_NT_RNAseq/fastp_result/ly${i}_${a}_trimmed.fq.gz -2 /home/chenyh/ly_NT_RNAseq/fastp_result/ly${i}_${b}_trimmed.fq.gz -S /home/chenyh/ly_NT_RNAseq/hisat2_result/ly${i}_mached.sam
      echo "ly${i}_${a} and ly${i}_${b} are finish"
    done
    echo "All complete"
    echo $(date "+%Y-%m-%d %H:%M:%S")
    
    [cyh@localhost Desktop]$ vim for.sh
    [cyh@localhost Desktop]$ cat for.sh
    #!/bin/bash
    sum=0
    for ((i=0;i<=50;i++))
    do
            sum=$(( $sum+$i ))
    done
    echo "the sum of 1+2+3+...+50=$sum"
    [cyh@localhost Desktop]$ bash for.sh
    the sum of 1+2+3+...+50=1275
    
  • while 循环

    用法格式:

    while [ 条件判断式 ]  #注意while后面有个空格,条件判断式两端有空格,否则报错
    do
    	语句
    done
    

用法举例:

  #!/bin/bash
  i=1
  sum=0
  #如果变量i的值小于等于50,则执行循环
  while [ $i -le 100 ]
  do
  	sum=$(( $sum+$i ))
  	i=$(( $i+2 ))
  done
  echo "The sum of 1+2+3+…+50 is: $sum"
  [cyh@localhost Desktop]$ vim while.sh  #编写脚本
  [cyh@localhost Desktop]$ cat while.sh    #查看内容
  #!/bin/bash
  i=1
  sum=0
  #如果变量i的值小于等于100,则执行循环
  while [ $i -le 100 ]
  do
          sum=$(( $sum+$i ))
          i=$(( $i+1 ))
  done
  echo "The sum of 1+2+3+…+100 is: $sum"
  [cyh@localhost Desktop]$ bash while.sh  #执行脚本
  The sum of 1+2+3+…+100 is: 5050
  [cyh@localhost Desktop]$

循环语句还有多个,比如until 等。这里不一一举例。

循环控制命令

在循环过程中,会有不同的需求,例如,符合条件需要终止循环,以及退出本轮循环。

  • break :终止循环。

  • continue :退出本轮循环,继续下轮循环。

    举例如下:

    [cyh@localhost Desktop]$ vim while.sh  #编写脚本
    [cyh@localhost Desktop]$ cat while.sh   #查看脚本
    #!/bin/bash
    i=1
    sum=0
    #如果变量i的值小于等于45,则执行循环
    while [ $i -le 100 ]
    do
            if [ $i -lt 45 ]
            then
                    sum=$(( $sum+$i ))
                    i=$(( $i+2 ))
                    continue;   #退出本轮循环,后续语句不执行
                    echo "$i < 45"
            fi
            echo "$i > 45"
            break;  #结束循环
    done
    echo "The sum of 1+2+3+…+45 is: $sum"
    [cyh@localhost Desktop]$ bash while.sh  #执行脚本
    45 > 45
    The sum of 1+2+3+…+45 is: 484
    [cyh@localhost Desktop]$
    

用户管理

Linux 有多个用户,主要类型如下:

  • 超级用户(root):它具有一切权限, 只有进行系统维护(例如: 建立用户等)或其他必要情形下才用超级用户登录, 以避免系统出现安全问题。 在root 用户下,在等待输入的命令行前面,最后一行是 # ,普通用户是 $
  • 系统用户:是Linux系统正常工作所必需的内建的用户, 主要是为了满足相应的系统进程对文件属主的要求而建立的, 系统用户不能用来登录, 例如: bin、daemon、 adm、 lp等用户。注意该用户没有home目录
  • 普通用户:是为了让使用者能够使用Linux系统资源而建立的, 我们的大多数用户属于此类。

在这部分有许多关于用户管理的相关命令,如下:

  • useradd 命令

    功能:增加用户账号,但是要使用root 用户创建。

    用法格式:useradd [选项] 用户名

    主要参数:

    -e (expire):使用“YYYY-MM-DD”的格式指定用户账号过期日期

    -d (directory):该选项后面指定路劲参数,用于指定用户主目录路径

    -G :该选项后面需给出组群ID或组群名称参数,用于指定用户所属的附加组群

    -g :该选项后面需给出组群ID或组群名称参数,用于指定用户所属的初始组群

    -u :该参数用于指定用户UID,需在后面给出数字参数

    -r :创建的用户为系统用户

    举例:

useradd -u 1000 cyh  #添加普通用户,UID为100
useradd -r cyh   #添加系统用户
  • passwd 命令

    功能:设置用户密码。(需要root账户)

    格式:

    passwd [选项] [用户]
    

    部分选项:

    -d (delete):删除用户账户密码,用户登入不需要密码

    -l (lock):锁定用户账户

    -u (unlock):解锁用户账号

    -S (status):查看用户密码状态

    用法举例:

    [root@localhost cyh]# passwd -S cyh  #查看用户的密码状态
    cyh PS 1969-12-30 0 99999 7 -1 (Password set, SHA512 crypt.)
    [root@localhost cyh]# passwd cyh  #更改用户(cyh)密码
    Changing password for user cyh.
    New password:                          #输入密码的过程密码密码不会显示,不是你的键盘失灵
    Retype new password:
    passwd: all authentication tokens updated successfully.
    
  • id 命令

    功能:查看用户账号UID,GID

    格式:

    id 用户名
    

    用法举例:

    [root@localhost cyh]# id cyh
    uid=1000(cyh) gid=1000(cyh) groups=1000(cyh),10(wheel)
    
  • userdel 命令

    功能:删除用户账户

    格式:

    userdel [选项] 用户名
    

    参数:

    -r :删除用户的主目录和邮件文件内容

Linux安装软件

一、使用yum 安装软件。

我安装软件通常使用两种方式,然而Linux安装软件有多种方式,目前centos 可以使用yum 进行软件的安装与升级。但是,并不是所有软件yum 都含有,可以把yum 理解为手机应用商店。

yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

yum 是基于rpm 的软件在线管理器,部分参数如下:

  • install [软件名列表] :安装列表中的软件。

  • update [软件名列表]:更新列表中的软件包。(不另加任何参数情况下)

  • remove [软件名列表]:移除列表中的软件包。(删除/卸载软件)

  • list [软件名列表]:列出软件包的各种信息。

  • clean [软件名列表]:清除yum 缓存。另加参数all 删除所有缓存。

yum常用命令

  • 列出所有可更新的软件清单命令:yum check-update

  • 更新所有软件命令:yum update

  • 仅安装指定的软件命令: yum install <package_name>

  • 仅更新指定的软件命令:yum update <package_name>

  • 列出所有可安裝的软件清单命令:yum list

  • 删除软件包命令:yum remove <package_name>

  • 查找软件包命令:**yum search **

  • 清除缓存命令:

    • yum clean packages: 清除缓存目录下的软件包
    • yum clean headers: 清除缓存目录下的 headers
    • yum clean oldheaders: 清除缓存目录下旧的 headers
    • yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的 headers

我使用yum 安装软件的步骤。

我们需要的软件包不清楚yum 源中是否有,我可以查询一下,以samtools 软件为例:

下面例子中出现了该包的一些信息,但是没有显示可以安装,可能yum 源中没有。

[cyh@localhost Desktop]$ yum search samtools
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
 * base: ftp.sjtu.edu.cn
 * centos-sclo-rh: ftp.sjtu.edu.cn
 * centos-sclo-sclo: ftp.sjtu.edu.cn
 * elrepo: dfw.mirror.rackspace.com
 * epel: ftp.cse.buffalo.edu
 * extras: ftp.sjtu.edu.cn
 * updates: ftp.sjtu.edu.cn
ius                                                                               209/209
================================= N/S matched: samtools ==================================
samtools.x86_64 : Tools for nucleotide sequence alignments in the SAM format

  Name and summary matches only, use "search all" for everything.
[cyh@localhost Desktop]$

对于yum 源中有的软件包,只需要使用install 安装。(需要使用管理员账户)

[root@localhost Desktop]# yum install gcc  #
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Could not get metalink https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=x86_64 error was
14: curl#6 - "Could not resolve host: mirrors.fedoraproject.org; Unknown error"
 * base: mirrors.bfsu.edu.cn
 * centos-sclo-rh: mirrors.bfsu.edu.cn
 * centos-sclo-sclo: mirrors.bfsu.edu.cn
 * elrepo: mirror-hk.koddos.net
 * epel: dfw.mirror.rackspace.com
 * extras: mirrors.bfsu.edu.cn
 * updates: mirrors.bfsu.edu.cn
http://mirrors.qlu.edu.cn/centos/7.9.2009/os/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: mirrors.qlu.edu.cn; Unknown error"
.
.
.
http://mirrors.bfsu.edu.cn/centos/7.9.2009/updates/x86_64/Packages/kernel-headers-3.10.0-1160.95.1.el7.x86_64.rpm: [Errno 14] curl#6 - "Could not resolve host: mirrors.bfsu.edu.cn; Unknown error"
Trying other mirror.


Error downloading packages:
  glibc-headers-2.17-326.el7_9.x86_64: [Errno 256] No more mirrors to try.
  kernel-headers-3.10.0-1160.95.1.el7.x86_64: [Errno 256] No more mirrors to try.
  glibc-devel-2.17-326.el7_9.x86_64: [Errno 256] No more mirrors to try.
  gcc-4.8.5-44.el7.x86_64: [Errno 256] No more mirrors to try.
  cpp-4.8.5-44.el7.x86_64: [Errno 256] No more mirrors to try.

  • 对于使用yum ,可以另外装一些源,源可以理解为不同得应用商店。

    这部分自行百度(没有空写了)。我安装得源有RemiEPELphp 等。

  • 对于yum 源中没有的软件包,我们可以直接浏览器找到官网复制下载链接。 linux 下使用wget 命令下载(或其他)。后续直接解压(部分需要编译)

    一:对于不需要编译的软件,以Hisat2 软件为例:

    1、使用wget 下载 Hista2 安装包(该地址可能会变,仅供参考)

    [root@localhost Desktop]# wget ftp://ftp.ccb.jhu.edu/pub/infphilo/hisat2/downloads/hisat2-2.1.0-Linux_x86_64.zip
    

    2、解压(压缩包为 .zip 文件,使用unzip 解压)

    [root@localhost Desktop]# unzip unzip /home/cyh/biosoft/hisat2-2.1.0-Linux_x86_64.zip
    

    3、配置环境,将信息写入 ~/.bashrc 或者 /etc/profile

    [root@localhost Desktop]# vim ~/.bashrc   #编辑该该文件
    export PATH="/你的全路径/hisat2-2.1.0: $PATH"  #在~/.bashrc文件末尾输入这行内容,路径是你自己的
    [root@localhost Desktop]# source ~/.bashrc  #重启文件,立即生效
    

    二、对于需要编译的软件(以samtools 为例)

    #安装依赖,该软件需要依赖
    [root@localhost Desktop]# yum install bzip2-devel ncurses-libs ncurses-devel xz-devel zlib-devel  
    [root@localhost Desktop]# wget https://github.com/samtools/samtools/releases/download/1.17/samtools-1.17.tar.bz2   #download packages
    [root@localhost Desktop]# tar -jxvf samtools-1.17.tar.bz2  #解压
    

    解压后,你会得到一个文件夹,文件名一般是软件名称带版本信息,例如:samtools-1.17

    进入该文件,你会看到文件里面含有configure 的文件夹(与之同级的还有许多源代码文件),含有这个文件的一般都是需要编译的。

    在于configure 同级目录里输入以下内容:(注意路径是你的路径,不是我的)

    [root@localhost Desktop]# ./configure --prefix=/home/lh/biosoft/samtools-1.17 #进入samtools-1.17文件,注意路径是你的目录,需要全路径
    

    然后依次执行下面语句,不会报错就不要管他,千万不要中断,让他跑,可能会要一点时间,取决你的电脑编译速度于软件大小。(注意:make命令你电脑得先有或者这个命令安装过了)

    [root@localhost Desktop]# make  #编译
    [root@localhost Desktop]# make install  #编译后安装
    

    最后按上述方法配置好环境。

    我的建议是,不能死磕yum ,有可能你需要的包没有或很难安装或者有各种各样的依赖。:在安装软件部分,最稳妥,最方便,最不会掉进坑的技巧是直接浏览器搜索某软件如何安装,例如:linux下samtools软件如何安装。有大量教程避免走弯路。

本文结束,如果您能看到这里,那么对于Linux,应该是比较熟悉了。但是,也许你会发现一个问题,本篇博客并不是Linux系统得全部内容,以上便是我总结得,常用得一些命令与知识点,里面有些知识解释得并不全面,如果,你感兴趣,可以自行探索。然后对于以上内容有问题,可以留言。

Logo

更多推荐