Linux学习-Shell

Shell

Linux 的启动过程

  • BIOS-MBR-BootLoader(grub)-kernel-systemd-系统初始化-shell
    • BIOS BIOS引导,基本输入输出系统,在主板上,引导硬盘或光盘
    • MBR 硬盘主引导
    • BootLoader 启动和引导内核的工具,选择哪一个内核以及版本
    • kernel 内核,驱动硬件,然后初始化环境
    • systemd 1号进程,加载内核模块
  • 查看硬主引导记录
    • dd if=/dev/sda of=mbr/bin bs=446 count=1
    • hexdump -C mbr.bin 以十六进制方式查看,记录中有 55 aa 这个标记,说明硬盘是可引导的

shell 脚本的执行方式

  • 组合命令 用分号隔开:cd /var ; ls

  • 为了组合命令和多次执行,使用脚本文件来保存需要执行的命令,然后赋予该文件执行权限(chmod u+rx filename)

  • 用文件编写脚本,一般在第一行编写:#!/bin/bash 声明脚本使用什么解释器进行解释

  • 标准Shell脚本包含哪些元素

    • Sha-Bang 在第一行用 #! 开头
    • 命令
    • “#”号开头的注释
    • chmod u+x filename 可执行权限
    • 执行命令
      • bash ./filename.sh 会在当前bash进程下边创建一个子进程执行脚本。不用给脚本赋予执行权限也可以执行,执行完回到原目录
      • ./filename.sh 也会产生一个子进程,使用Sha-Bang说明的解释器。需要对脚本赋予权限才可以执行,执行完回到原目录
      • source ./filename.sh 在当前的进程中执行,需要对脚本赋予权限才可以执行,执行完停留在脚本的目录下
      • . filename.sh 在当前的进程中执行,执行完停留在脚本的目录下
  • 内建命令和外部命令的区别

    • 内建命令不需要创建子进程,内建命令对当前Shell生效

管道与重定向

  • 管道与管道符

    • 管道也是进程通信的方式之一
    • 管道符 “|”,将前一个命令执行的结果传递给后面的命令
      • ps | cat
      • echo 123 | ps
      • 管道符两边若是外部命令,则会建立子进程。若是使用内部命令,建议将命令封装在脚本之内再去执行。若无必要,避免在管道符内使用内部命令。
  • 子进程与子shell

  • 重定向符号

    • 一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符
    • 输入重定向符号 "<"
      • read var < /path/to/a/file
    • 输出重定向符号
      • ">" 清空文件后再进行输入
      • ">>" 文件保持不变,在末尾追加输入
      • “2>” 将错误的信息进行输出到指定文件
      • “&>” 无论正确或错误的信息,都输出到指定文件
      • 例:echo 123 > /path/a/file
    • 输入和输出重定向组合使用
      • cat > /path/a/file << EOF
      • I am #USER
      • EOF

变量

  • 变量名的命名规则

    • 字母、数字、下划线
    • 不以数字开头
  • 给变量赋值

    • a=123 "="左右两边不允许出现空格,系统会认为左边是一条命令去执行
    • let a=10+19
    • l=ls 将命令赋值给变量
    • letc=$(ls -l /etc) 将命令结果赋值给变量,使用$()或‘‘
    • 变量中若有空格或特殊字符,可包含在" "或 ‘ ‘ 中
  • 变量引用

    • ${变量名} 引用变量,在部分情况下可以省略为 $变量名
  • 变量一般作用在当前的shell进程和当前的终端中,若想要对当前进程也生效的话,使用 source 方式执行脚本

  • export + 变量,可以使子进程获取父进程的变量取值

  • 环境变量:每个shell打开都可以获取的变量

    • set 和 env 变量

    • $? 上一条命令是否正确执行成功; $$ 显示当前进程的PID; $0 当前进程的名称;

    • $PATH 命令的搜索路径

      • PATH=$PATH:/root 若一个命令文件放在/root 下面,通过这个方式将/root 添加到搜索路径下,则在任何地方都可以直接执行文件,从而执行命令。对当前终端和子shell生效,换其他终端则无效。
    • $PS1

  • 位置变量

    • $1 $2 $3 ... $9 ${10}
    • pos=${1-_} 表示若$1的取值是空值,则用下划线给pos赋值;若$1有内容,则用$1赋值
  • 环境变量配置文件

    • 配置文件,保存在/etc 目录下面的配置文件,都是通用的,普通用户可用。~下面的配置文件,是用户的家目录配置文件
      • /etc/profile 保存系统和终端启动时的配置文件,使用su - +用户名 时,这个文件第一个被加载。例如 su - root 依次加载的文件:
        /etc/profile
        .bash_profile
        .bashrc
        /etc/bashrc
        以上顺序,若在定义变量时,在各个配置文件中若名称有重复,后面的执行的脚本会把前面的变量给覆盖掉。
        若要使当前系统的所有终端都可用,使用下面语句:
        export PATH=$PATH:/new/path 将该语句写入到上面的配置文件中,则父进程和子进程,以及所有终端都可以使用相关环境变量。
      • /etc/profile.d/
      • ~/.bash_profile
      • ~/bashrc
      • /etc/bashrc
    • 在配置文件中添加环境变量后,如何生效?
      1. 关掉终端,重新打开
      2. source + 配置文件 执行,如 source /etc/bashrc

数组

  • 定义数组
    • IPTS=(10 11 12)
  • 显示数组所有元素
    • echo ${IPTS[@]}
  • 显示数组元素个数
    • echo ${#IPTS[@]}
  • 显示数组的第一个元素
    • echo ${IPTS[0]}

转义与引用

  • 特殊字符
    • "#" 注释, ";"分号,""转义符号,"""和"‘" 双引号和单引号
    • " ‘ ` 双引号,单引号和反引号的区别。双引号不完全引用,包含变量的话会进行解释,单引号完全引用,包含变量的话不会进行解释。反引号用于执行命令。
    • 由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释
    • 由双引号括起来的字符,除 $、反引号 (`) 和反斜线 (\) 仍保留其特殊功能外,其余字符均作为普通字符对待。“$”表示变量替换;反引号表示命令替换;
    • 反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分

算数运算

  • expr 4+5 expr 只支持整数
  • num=`expr 4+5`
  • (( a=4+5 )) ; echo $a,双圆括号相当于 let 命令

特殊符号

  • (),单独使用圆括号,会产生一个子进程。( abc=123 );echo $abc 时不会显示。
  • [] 用于测试,相当于 test 命令,测试两个字符,判断文件类型以及对数字大小作比较。
    如[ 5 -gt 4 ];echo $?
  • [[]] 双中括号用于表达式,如 [[ 5 > 4 ]];echo $?
  • {},用于规定范围,如 echo {0..9}

退出与退出命令

  • 退出程序命令
    • exit
    • exit 10 返回10给shell,返回值非0位不正常退出
    • $? 判断当前shell前一个进程是否正常退出
    • test 命令用于检查文件或者比较值

相关推荐