认识bash这个shell

  • shell的功能只是提供用户操作系统的一个接口

image.png

  • Linux默认使用的Shell是”Bourne Again Shell”(简称bash), 这个shell是Bourne Shell的增强版本, 也是基于GNU的架构下发展出来的
  • bash的主要优点:

    • 命令记忆能力(history), 能将命令执行记录记录在~/.bash_history中
    • 命令与文件补全功能(Tab键)
    • 命令别名设置功能(alias)

      1. 查看当前别名
      2. alias
      3. 设置命令别名
      4. alias lm='ls -al'
    • 作业控制, 前台, 后台控制

    • 程序脚本(shell script)
    • 通配符
  • bash shell的内置命令: type
    • 为了方便shell的操作, bash已经”内置”了很多命令, 如cd, umask等
    • 可以通过type来查看命令是来自于外部还是内置在bash中的

image.png

  • type主要在于找出”执行文件”而不是一般文件名, 所以type也可以用来作为类似which的用途
    • 在命令行执行shell时, 可以使用\来转义enter键避免命令过长, 但是注意\与enter之间没有空格, 否则就是在转义空格了

shell的变量功能

什么是变量

  • 变量具有可读性, 方便性, 方便写脚本程序
  • 当正确的登录Linux后, 用户会有一个bash的执行程序来跟Linux通信; 而在进入shell之前, 系统需要一些变量来提供它数据的访问(或一些环境的设置参数值), 这些变量被称为环境变量, 为了区别自定义变量, 环境变量通常由大写字符表示, 如PATH, HOME, MAIL, SHELL等
  • 变量定义: 变量是以一组文件或符号等, 来替换一些设置或者是一串保留的数据

变量的显示与设置: echo, unset

  • 变量的显示, echo $variable或${variable}
  • 变量的设置

image.png

  • 变量设置规则

    • 变量与变量内容以=来连接, 如myname=123
    • 等号两边不能直接接空格符
    • 变量名称只能是英文或数字, 但开头字符不能是数字
    • 变量内容若有空格符可使用”或’将变量内容结合起来, 但是双引号内的特殊字符如$会保持原本的特性, 单引号内的字符则仅为一般字符(纯文本), 如下示例

      1. root@DESKTOP-LMORNNS:/# echo $LANG
      2. C.UTF-8
      3. root@DESKTOP-LMORNNS:/# var="lang is $LANG"
      4. root@DESKTOP-LMORNNS:/# echo $var
      5. lang is C.UTF-8
      6. root@DESKTOP-LMORNNS:/# var2='lang is $LANG'
      7. root@DESKTOP-LMORNNS:/# echo $var2
      8. lang is $LANG
    • 可用转义字符\将特殊符号编程一般字符

    • 在一串命令中, 还需要通过其他命令提供的信息, 可以使用反单引号命令或者$(命令), 如下示例

      1. root@DESKTOP-LMORNNS:/# uname -r
      2. 5.10.16.3-microsoft-standard-WSL2
      3. root@DESKTOP-LMORNNS:/# ver=$(uname -r)
      4. root@DESKTOP-LMORNNS:/# echo $ver
      5. 5.10.16.3-microsoft-standard-WSL2
    • 增加变量时, 可用$变量名称或${变量名称}累加内容, 如PATH=$PATH:/home/bin

    • 若该变量需要在其他子进程执行, 则需要以export来使变量变成环境变量export PATH
    • 通常大写字符为系统默认变量, 自行设置变量一般使用小写字符
    • 取消变量: unset 变量名称

变量示例
image.png

环境变量的功能

  • 使用env来查看环境变量

    1. root@DESKTOP-LMORNNS:/# env
    2. SHELL=/bin/bash ==>linux默认使用的shell
    3. WSL_DISTRO_NAME=Ubuntu-20.04
    4. WT_SESSION=d8076e38-b11d-4adf-8e76-6e53d48a9abc
    5. NAME=DESKTOP-LMORNNS
    6. PWD=/
    7. LOGNAME=root
    8. MOTD_SHOWN=update-motd
    9. HOME=/root ==>用户的主文件夹
    10. LANG=C.UTF-8 ==>语系数据,中文一般是zh_CN.gb2313zh_CN.UTF-8
    11. WSL_INTEROP=/run/WSL/11_interop
    12. LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
    13. LESSCLOSE=/usr/bin/lesspipe %s %s
    14. TERM=xterm-256color
    15. LESSOPEN=| /usr/bin/lesspipe %s
    16. USER=root
    17. SHLVL=1
    18. WSLENV=WT_SESSION::WT_PROFILE_ID
    19. XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
    20. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/ProgramData/Oracle/Java/javapath:/mnt/c/Java/jdk1.8.0_40/bin:/mnt/c/Java/jdk1.8.0_40/jre/bin:/mnt/c/apache-maven-3.6.1/bin:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/nodejs/:/mnt/d/soft/mysql-8.0.20-winx64/bin:/mnt/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/ProgramData/DockerDesktop/version-bin:/mnt/c/Users/Administrator/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/Administrator/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/d/DEVELOP/node_global:/mnt/c/Users/Administrator/AppData/Local/Programs/oh-my-posh/bin:/snap/bin
    21. HOSTTYPE=x86_64
    22. WT_PROFILE_ID={07b52e3e-de2c-5db4-bd2d-ba144ed6c273}
    23. _=/usr/bin/env ==>上一次使用的命令的最后一个参数或命令本身
    24. OLDPWD=/root
    • RANDOM: 随机数变量, /dev/random文件, 在bash环境下, random变量值在0~32767之间
      1. 随机取出0~9之间的数值
      2. declar -i number=$RANDOM*10/32768;echo $number
  • 用set查看所有变量(含环境变量和自定义变量), set除了环境变量之外, 还会将bash内的其他变量全部显示出来(与操作接口有关的变量以及用户自定义的变量)

image.png

  • PS1提示符的设置

image.png

  • $(关于本shell的PID), $本身也是一个变量, 代表目前这个shell的线程id即PID, 因此可以用echo $$来查看当前shell的PID
  • ?(关于上个执行命令的回传码), ?也是个特殊的变量, 代表上一个执行的命令所回传的值, 如果成功执行该命令, 则会回传一个0值, 如果执行发生错误, 就会回传错误代码, 一般都是非0值

image.png

  • OSTYPE, HOSTTYPE, MACHTYPE(主机硬件与内核的等级)
  • export: 将自定义变量转成环境变量
    • 父子进程
    • image.png
    • 子进程仅会继承父进程的环境变量, 子进程不会继承父进程的自定义变量

影响显示结果的语系变量(locale)

  • 使用locale查询语系的变量

    • 如果其他的语系变量都未设置, 且有设置LANG或LC_ALL时, 则其他的语系变量就会被这两个变量所替换, 因此在Linux中, 通常说明仅设置LANG这个变量
    • 这些语系文件都放置在/usr/lib/locale目录中

      1. root@DESKTOP-LMORNNS:/# locale
      2. LANG=C.UTF-8
      3. LANGUAGE=
      4. LC_CTYPE="C.UTF-8"
      5. LC_NUMERIC="C.UTF-8"
      6. LC_TIME="C.UTF-8"
      7. LC_COLLATE="C.UTF-8"
      8. LC_MONETARY="C.UTF-8"
      9. LC_MESSAGES="C.UTF-8"
      10. LC_PAPER="C.UTF-8"
      11. LC_NAME="C.UTF-8"
      12. LC_ADDRESS="C.UTF-8"
      13. LC_TELEPHONE="C.UTF-8"
      14. LC_MEASUREMENT="C.UTF-8"
      15. LC_IDENTIFICATION="C.UTF-8"
      16. LC_ALL=
      17. root@DESKTOP-LMORNNS:/#
    • 整体系统默认的语系定义在/etc/sysconfig/i18n

image.png

变量的有效范围

  • 环境变量可以被子进程所引用, 但其他的自定义变量不会存在于子进程中

变量键盘读取, 数组与声明: read, array, declare

324