认识bash这个shell
- shell的功能只是提供用户操作系统的一个接口
- Linux默认使用的Shell是”Bourne Again Shell”(简称bash), 这个shell是Bourne Shell的增强版本, 也是基于GNU的架构下发展出来的
bash的主要优点:
- 命令记忆能力(history), 能将命令执行记录记录在~/.bash_history中
- 命令与文件补全功能(Tab键)
命令别名设置功能(alias)
查看当前别名
alias
设置命令别名
alias lm='ls -al'
作业控制, 前台, 后台控制
- 程序脚本(shell script)
- 通配符
- bash shell的内置命令: type
- 为了方便shell的操作, bash已经”内置”了很多命令, 如cd, umask等
- 可以通过type来查看命令是来自于外部还是内置在bash中的
- type主要在于找出”执行文件”而不是一般文件名, 所以type也可以用来作为类似which的用途
- 在命令行执行shell时, 可以使用\来转义enter键避免命令过长, 但是注意\与enter之间没有空格, 否则就是在转义空格了
shell的变量功能
什么是变量
- 变量具有可读性, 方便性, 方便写脚本程序
- 当正确的登录Linux后, 用户会有一个bash的执行程序来跟Linux通信; 而在进入shell之前, 系统需要一些变量来提供它数据的访问(或一些环境的设置参数值), 这些变量被称为环境变量, 为了区别自定义变量, 环境变量通常由大写字符表示, 如PATH, HOME, MAIL, SHELL等
- 变量定义: 变量是以一组文件或符号等, 来替换一些设置或者是一串保留的数据
变量的显示与设置: echo, unset
- 变量的显示, echo $variable或${variable}
- 变量的设置
变量设置规则
- 变量与变量内容以=来连接, 如myname=123
- 等号两边不能直接接空格符
- 变量名称只能是英文或数字, 但开头字符不能是数字
变量内容若有空格符可使用”或’将变量内容结合起来, 但是双引号内的特殊字符如$会保持原本的特性, 单引号内的字符则仅为一般字符(纯文本), 如下示例
root@DESKTOP-LMORNNS:/# echo $LANG
C.UTF-8
root@DESKTOP-LMORNNS:/# var="lang is $LANG"
root@DESKTOP-LMORNNS:/# echo $var
lang is C.UTF-8
root@DESKTOP-LMORNNS:/# var2='lang is $LANG'
root@DESKTOP-LMORNNS:/# echo $var2
lang is $LANG
可用转义字符\将特殊符号编程一般字符
在一串命令中, 还需要通过其他命令提供的信息, 可以使用反单引号
命令
或者$(命令), 如下示例root@DESKTOP-LMORNNS:/# uname -r
5.10.16.3-microsoft-standard-WSL2
root@DESKTOP-LMORNNS:/# ver=$(uname -r)
root@DESKTOP-LMORNNS:/# echo $ver
5.10.16.3-microsoft-standard-WSL2
增加变量时, 可用$变量名称或${变量名称}累加内容, 如PATH=$PATH:/home/bin
- 若该变量需要在其他子进程执行, 则需要以export来使变量变成环境变量export PATH
- 通常大写字符为系统默认变量, 自行设置变量一般使用小写字符
- 取消变量: unset 变量名称
变量示例
环境变量的功能
使用env来查看环境变量
root@DESKTOP-LMORNNS:/# env
SHELL=/bin/bash ==>linux默认使用的shell
WSL_DISTRO_NAME=Ubuntu-20.04
WT_SESSION=d8076e38-b11d-4adf-8e76-6e53d48a9abc
NAME=DESKTOP-LMORNNS
PWD=/
LOGNAME=root
MOTD_SHOWN=update-motd
HOME=/root ==>用户的主文件夹
LANG=C.UTF-8 ==>语系数据,中文一般是zh_CN.gb2313或zh_CN.UTF-8
WSL_INTEROP=/run/WSL/11_interop
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:
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
USER=root
SHLVL=1
WSLENV=WT_SESSION::WT_PROFILE_ID
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
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
HOSTTYPE=x86_64
WT_PROFILE_ID={07b52e3e-de2c-5db4-bd2d-ba144ed6c273}
_=/usr/bin/env ==>上一次使用的命令的最后一个参数或命令本身
OLDPWD=/root
- RANDOM: 随机数变量, /dev/random文件, 在bash环境下, random变量值在0~32767之间
随机取出0~9之间的数值
declar -i number=$RANDOM*10/32768;echo $number
用set查看所有变量(含环境变量和自定义变量), set除了环境变量之外, 还会将bash内的其他变量全部显示出来(与操作接口有关的变量以及用户自定义的变量)
- PS1提示符的设置
- $(关于本shell的PID), $本身也是一个变量, 代表目前这个shell的线程id即PID, 因此可以用echo $$来查看当前shell的PID
- ?(关于上个执行命令的回传码), ?也是个特殊的变量, 代表上一个执行的命令所回传的值, 如果成功执行该命令, 则会回传一个0值, 如果执行发生错误, 就会回传错误代码, 一般都是非0值
- OSTYPE, HOSTTYPE, MACHTYPE(主机硬件与内核的等级)
- export: 将自定义变量转成环境变量
- 父子进程
- 子进程仅会继承父进程的环境变量, 子进程不会继承父进程的自定义变量
影响显示结果的语系变量(locale)
使用locale查询语系的变量
- 如果其他的语系变量都未设置, 且有设置LANG或LC_ALL时, 则其他的语系变量就会被这两个变量所替换, 因此在Linux中, 通常说明仅设置LANG这个变量
这些语系文件都放置在/usr/lib/locale目录中
root@DESKTOP-LMORNNS:/# locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
root@DESKTOP-LMORNNS:/#
整体系统默认的语系定义在/etc/sysconfig/i18n
变量的有效范围
- 环境变量可以被子进程所引用, 但其他的自定义变量不会存在于子进程中
变量键盘读取, 数组与声明: read, array, declare
324