Linux学习笔记(7)——认识与学习Bash
认识与学习Bash
一、认识Bash这个Shell
1.1 Shell
操作系统的内核(kernel)管理整个计算机硬件,这个内核需要被保护。用户通过Shell跟内核沟通,使其完成我们所需的任务。
壳程序(Shell)的功能只是提供用户操作系统的一个界面,即只要能够操作应用程序的软件都能够称为壳程序。
- 狭义的壳程序:命令行方面的软件
- 广义的壳程序:图形用户界面模式的软件等
[admin@localhost ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
用户默认取得哪一个Shell?
[admin@localhost ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
admin:x:1000:1000:admin:/home/admin:/bin/bash
...
Bash(Bourne Again Shell)
,这是Bourne Shell的增强版本,也是基准于GNU架构下发展出来的。
1.2 Bash shell的功能
- 历史命令(history)
.bash_history
记录的是前一次登陆以前所执行过的命令,而至于这一次登陆所执行的命令都被缓存在内存中,成功注销系统后才会记录到.bash_history
当中。
- 命令与文件补全功能([Tab]按键)
- 一串命令第一个字后面,命令补齐
- 一串命令第二个字后面,文件补齐
- bash-completion软件,选项/参数补齐
- 命令别名设置功能(alias)
alias lm='ls -al'
- 任务管理、前台、后台控制:(job control、foreground、background)
- 程序化脚本:(shell scripts)
- 通配符:(Wildcard)
1.3 查询命令是否为Bash shell的内置命令:type
[admin@localhost ~]$ type ls
ls is aliased to `ls --color=auto'
[admin@localhost ~]$ type -t ls
alias
[admin@localhost ~]$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
ls is /usr/bin/ls
[admin@localhost ~]$ type cd
cd is a shell builtin
1.4 命令执行与快速编辑按钮
[admin@localhost ~]$ cp /var/spool/mail/root /etc/crontab \
> /etc/fstab /root
注意:[Enter]
键紧接着反斜杠(\
),两者中间没有其他字符,因为仅转义紧接着的下一个字符而已。
二、Shell的变量功能
2.1 什么是变量?
变量就是以一组文字或符号等,来替换一些设置或一串保留的数据。
2.2 变量的使用与设置:echo、变量设置规则、unset
-
变量的使用:echo
[admin@localhost mail]$ echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/admin/.local/bin:/home/admin/bin [admin@localhost mail]$ echo $SHELL /bin/bash [admin@localhost mail]$ echo $HOME /home/admin [admin@localhost mail]$ echo $MAIL /var/spool/mail/admin
注意:在bash当中,当一个变量名称尚未被设置时,默认的内容是【空】
-
变量的设置规则
- 变量与变量内容以一个等号【=】来连接
myname=Sino
- 等号两边不能接空格
- 变量内容若有空格可使用双引号或单引号将变量内容结合起来
- 双引号内的特殊字符如
$
等,可以保有原本的特性[admin@localhost mail]$ var="lang is $LANG" [admin@localhost mail]$ echo $var lang is en_US.UTF-8
- 单引号内的特殊字符则仅为一般字符(纯文本)
[admin@localhost mail]$ var='lang is $LANG' [admin@localhost mail]$ echo $var lang is $LANG
- 可用转义符【
\
】将特殊符号(如[Enter]
、$
、\
、空格
、'
等)变成一般字符[admin@localhost mail]$ myname=Sino\ Zhao [admin@localhost mail]$ echo $myname Sino Zhao
- 在一串命令的执行中,还需要借由其他额外的命令所提供的信息时,可以使用反单引号【`命令】或【$(命令)】
[admin@localhost mail]$ version=$(uname -r) [admin@localhost mail]$ echo $version 3.10.0-1160.el7.x86_64 [admin@localhost mail]$ version=`uname -r` [admin@localhost mail]$ echo $version 3.10.0-1160.el7.x86_64
- 若该变量为扩增变量内容时,可用
"$变量名称"
或${变量}
累加内容[admin@localhost mail]$ PATH="$PATH":/home/bin [admin@localhost mail]$ PATH=${PATH}:/home/bin
- 若该变量需要在其他子程序执行,则需要以
export
来使变量变成环境变量export PATH
- 子进程:目前这个Shell的情况下,去启用新的一个Shell,新的Shell就是子进程
- 通常大写字符为系统默认变量,自行设置变量可以使用小写字符,方便判断
- 取消变量的方法为使用:unset:【unset 变量名称】
- 可用转义符【
- 变量与变量内容以一个等号【=】来连接
2.3 环境变量的功能
-
用env观察环境变量与常见环境变量说明
[admin@localhost ~]$ env XDG_VTNR=1 SSH_AGENT_PID=68720 XDG_SESSION_ID=31 HOSTNAME=localhost.localdomain IMSETTINGS_INTEGRATE_DESKTOP=yes VTE_VERSION=5204 TERM=xterm-256color SHELL=/bin/bash XDG_MENU_PREFIX=gnome- HISTSIZE=1000 GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/ 6c771a21_b247_4eb2_9e33_69f2593f7e28 QTDIR=/usr/lib64/qt-3.3 QTINC=/usr/lib64/qt-3.3/include QT_GRAPHICSSYSTEM_CHECKED=1 IMSETTINGS_MODULE=none USER=admin LS_COLORS=rs=0:di=38;5... GNOME_TERMINAL_SERVICE=:1.145 SSH_AUTH_SOCK=/run/user/1000/keyring/ssh SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/68625,unix/unix:/ tmp/.ICE-unix/68625 GNOME_SHELL_SESSION_MODE=classic PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/admin/.local/bin:/home/admin/bin MAIL=/var/spool/mail/admin QT_IM_MODULE=ibus PWD=/home/admin XMODIFIERS=@im=ibus LANG=en_US.UTF-8 HISTCONTROL=ignoredups XDG_SEAT=seat0 HOME=/home/admin SHLVL=3 GNOME_DESKTOP_SESSION_ID=this-is-deprecated LOGNAME=admin QTLIB=/usr/lib64/qt-3.3/lib XDG_DATA_DIRS=/home/admin/.local/share/flatpak/exports/share:/ var/lib/flatpak/exports/share:/usr/local/share:/usr/share DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-Frdj2d8amC, guid=cdd9563064c903c90929acad6361c6c4 LESSOPEN=||/usr/bin/lesspipe.sh %s WINDOWPATH=1 XDG_RUNTIME_DIR=/run/user/1000 DISPLAY=:0 XDG_CURRENT_DESKTOP=GNOME COLORTERM=truecolor XAUTHORITY=/home/admin/.Xauthority _=/bin/env
-
用set观察所有变量
- PS1:(提示字符的设置)
-
export 自定义变量转成环境变量
- 变量是否会被子进程继续引用
- 子进程会继承父进程的环境变量,不继承自定义变量
-
影响显示结果的语系变量(locale)
2.6 变量键盘读取、数组与声明:read、array、declare
2.7 与文件系统及程序的限制关系:ulimit
限制用户的某些系统资源,包括可以开启的文件数量,可以使用的cpu时间,可以使用的内存总量等
三、命令别名与历史别名
3.1 命令别名设置:alias、unalias
[admin@localhost ~]$ alias lm='ls -al | more'
[admin@localhost ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias lm='ls -al | more'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[admin@localhost ~]$ unalias lm
3.2 历史命令:history
[admin@localhost ~]$ echo ${HISTSIZE}
1000
[admin@localhost ~]$ history 3
295 history
296 echo ${HISTSIZE}
297 history 3
四、Bash Shell的操作环境
4.1 路径与命令查找顺序
- 以相对/绝对路径执行命令
- 由alias找到该命令执行
- 由bash内置的(builtin)命令来执行
- 通过$PATH这个变量的顺序查找到的第一个命令来执行
4.2 bash的登录与欢迎信息:/etc/issue、/etc/motd
4.3 bash的环境配置文件
- login 与 non-login shell
- login shell读取的配置文件
- /etc/profile:这是系统整体的设置,最好不要修改这个文件
- /.bash_profile或/.bash_login或~/.profile:属于用户个人设置,添加自己的数据
- non-login shell读取的配置文件
- ~/.bashrc
- login shell读取的配置文件
- /etc/profile:每个用户登录bash时一定会读取的配置文件
- PATH、MAIL、USER、HOSTNAME、HISTSIZE、umask...
- /etc/profile.d/*.sh:该目录下的文件规范了bash操作界面的颜色、语系、ll与ls命令的命令别名、vi的命令别名、which的命令别名等。如果需要帮所有用户设置一些共享等命令别名时,可以在该目录下自行建立扩展名为.sh的文件
- /etc/locale.conf:由/etc/profile/lang.sh调用,决定bash默认使用何种语系
- /usr/share/bash-completion/completions/*:命令补齐等
- ~/.bash_profile
- 个人偏好配置文件主要有三个,但只会依序读取一个
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
- 个人偏好配置文件主要有三个,但只会依序读取一个
- source:读入环境配置文件的命令
[admin@localhost ~]$ source ~/.bashrc [admin@localhost ~]$ . ~/.bashrc #等价于source
- ~/.bashrc(non-login shell会读)
- 其他相关配置文件
- /etc/man_db.conf
- ~/.bash_history
- ~/.bash_logout
4.4 终端的环境设置:stty、set
4.5 通配符与特殊符号
*
:0个到无穷多个?
:一定有一个[]
:一定有一个在括号内[-]
:在编码顺序内的所有字符[^]
:反向选择
五、数据流重定向
5.1 什么是数据流重定向?
- standard output与standard error output
- stdin:< 或 <<
- stdout:> 或 >>
- stderr:2> 或 2>>
5.2 命令执行的判断根据:;、&&、||
六、管道命令(pipe)
- 管道命令仅会处理标准输出,对于标准错误会予以忽略
- 管道命令必须要能够接受来自前一个命令的数据成为标准输入继续处理才行
6.1 选取命令:cut、grep
- cut
cut -d '分隔字符' -f fields 选项与参数: -d:后面接分隔字符,与-f连用 -f:根据-d的分隔字符将一段信息划分为数段,用-f取出第几段 -c:以字符的单位取出固定字符区间
- grep
grep可以解析一行文字,取得关键词,若该行存在关键词,就会整行列出来grep [-acinv] [--color=auto] '查找字符' filename 选项与参数: -a:将二进制文件以文本文件的方式查找数据 -c:计算找到'查找字符'的次数 -i:忽略大小写的不同 -n:顺便输出行号 -v:反向选择 --color=auto:将找到的关键词部分加上颜色的显示
6.2 排序命令:sort、wc、uniq
6.3 双向重定向:tee
6.4 字符转换命令:tr、col、join、paste、expand
6.5 划分命令:split
6.6 参数代换:xargs
- 产生某个命令的参数
- 很多命令不支持管道命令,因此可以通过xargs提供命令使用的标准输入
6.7 关于减号【-】的用途
在管道命令中,常常会使用到前一个命令的stdout作为这次的stdin,某些命令需要用到文件名来进行处理时,该stdin与stdout可以利用减号"-"来替代