1、为什么要使用bash shell
(1)bash能记录使用过的命令,这些命令记录在~/.bash_history中。~/.bash_history记录的是上一次用户登录时使用的命令,而本次登录的命令只会在内存中。
(2)Tab的命令补全功能,可以让你少打很多字,并保证输入正确。
(3)命令别名alias的功能,省略很多长指令。
(4)工作进程前后台切换。
(5)shell 脚本。
(6)通配符,辅助快速查询。
2、查看bash的内建命令
type 【-tpa】 name
-t 只显示指令的类型(file-外部指令,alias-指令别名,builtin-内部指令)
-p 如果指令为外部指令时,才会显示完整文件名
-a 从PATH中找出所有命令,包含alias,这个选项会显示指令被执行的顺序
type只会查找能执行的命令,而不会查找包含命令的文件名,所以type也常被当成which使用。
3、变量的设定与使用
(1)读变量的值:$变量名,${变量名}
(2)设定变量及其规则:
- 使用变量名=变量值的形式设定
- 等号两边不能有任何空格
- 变量名只能是英文字母与数字,但开头不能用数字
- 变量值内容若有空格字符,需要使用双引号“或者单引号‘括起来。这里需要注意的是使用双引号时,里面的特殊字符会被转义,而单引号里的特殊字符不会被转义
- 可以使用反斜杠(\)将特殊字符变成一般字符
- 如果变量值需要使用其他命令的输出信息,则需要使用反单引号(`命令`,就是数字1左边的按键)或者使用$(命令)。
- 使用export 变量名将变量导出为环境变量,使得可以被子程序访问
- 取消变量设定:unset 变量名
(3)进入/退出子程序:bash/exit或logout
(4)一些特殊的环境变量
- ~:同HOME该变量表示用户家目录,可以用echo ~或echo $HOME打印其值
- -:上一个目录
- HISTSIZE:设置history命令能够记录的命令数
- MAIL:当我们使用mail指令收取信件时,回去MAIL中查找邮箱地址
- PATH:指令的路径,路径之间以冒号(:)隔开
- LANG:编码格式
- RANDOM:随机数变量
- PS1:命令提示符样式
- $:目前shell的pid
- ?:上一个指令的返回值,如果没有错误就会返回0,否则返回错误码,所以一般以0判断指令是否执行成功
(5)查看目前shell环境下变量
- env:只能查看环境变量
- export:export 变量名-将自定义变量导出为环境变量,可以被子程序使用,不加参数可以查看环境变量
- set:能查看环境变量和自定义变量
- declare:能查看环境变量和自定义变量
(6)查看系统支持的编码格式 locale,文件在/usr/lib/locale下
(7)读取用户输入
read -【pt】 变量名
-p 指定读取时的提示符
-t 指定在规定时间内读取用户输入
(8)定义数组变量
(9)声明变量:变量名[索引]=值
declare -【aixr】 变量名
+ 取消变量的属性
-a 将变量定义为数组
-i 将变量定义为整型
-x 将变量导出为环境变量
-r 将变量设定为只读,不可更改也不可被unset
-p 单独列出变量的类型
(10)限制用户使用的资源--------ulimit
(11)变量内容的修改与删除 ${变量#/*:}
- # 后面接匹配的字符串:从前面开始删除,删除遇到的第一个匹配的
- ## 后面接匹配的字符串:从前面开始删除,删除全部匹配的
- % 后面接匹配的字符串:从后面开始删除,删除遇到的第一个匹配的
- %% 后面接匹配的字符串:从后面开始删除,删除全部匹配的
- / 后面接匹配的字符串:替换第一个匹配的
- // 后面接匹配的字符串:替换全部匹配的
(12)类似于3目运算符
①var = $ { str - expr }
$str为null时,var=expr,否则var=$str
②var = $ { str :- expr }
$str为null或者空字符串时,var=expr,否则var=$str
③var = $ { str + expr }
$str为null时,var="" ,否则var=expr
④var = $ { str :+ expr }
$str为null或者空字符串时,var="" ,否则var=expr
⑤var = $ { str = expr }
$str为null时,str=var=expr ,否则str不变,var=$str
⑥var = $ { str := expr }
$str为null或者空字符串时,str=var=expr ,否则str不变,var=$str
⑦var = $ { str ? expr }
$str为null时,expr 输出至stderr,否则var=$str
⑧var = $ { str :? expr }
$str为null或者空字符串时,expr 输出至stderr,否则var=$str
4、命令别名
alias 别名=命令 参数 设置命令别名
unalias 别名 取消命令别名
5、历史命令
(1)查询历史命令
history n 显示最近n个命令
history -c 将目前shell中的命令记录全部删除
history -【raw】 历史文件
-a 将目前新增的历史命令新增进历史命令文件中,若没有历史命令文件,则加入~/.bash_history中
-r 将历史命令文件内容读取到history命令内存中
-w 将目前history内存中的命令写入历史命令文件中
(2)执行历史命令
!命令数字 使用history会打印出命令对应的编号,!编号会执行相应的命令
!命令字符 !后输入相应命令的前几个字符,可以执行以这些字符开头的命令
!! 执行最近一次的命令
6、路径与指令搜索顺序
- 以相对路径或绝对路径来执行命令,例如『/bin/ls』或『./ls』
- 由alias找到该指令来执行
- 由bash内建命令来执行
- 在PATH中搜索到第一个命令执行
- 使用type -a 命令可以查询同名指令的执行顺序
7、Linux登录画面更改
(1)我们可以在/etc/issue中修改我们需要修改的登录界面
(2)除了/etc/issue,还有个/etc/issue.net。这个是展现给使用telnet登录的用户看的
(3)/etc/motd是在用户登录后(包括一般用户与root)展现给用户的通知信息。
8、bash的环境配置文件
bash的环境配置文件分为2类:系统全局配置文件和用户环境配置文件
(1)login shell与non-login shell
login shell:取得bash时需要登录,就称为login shell
non-login shell:取得bash不需要重复登录的,就称为non-login shell
二者所需要读取的bash文件配置不一样。
(2)login shell读取的配置文件
- /etc/profile:这是系统整体的设定,最好不要修改。
- ~/.bash_profile或~/.bash_login或~/.profile:这些是用户配置,相当于windows的系统环境变量和用户环境变量之分
①系统配置文件
/etc/profile设定的变量主要有:
PATH |
依据UID决定PATH变量会不会含有sbin的系统指令目录 |
MAIL |
根据用户名设置mailbox为/var/spool/mail/用户名 |
USER |
用户名 |
HOSTNAME |
主机名 |
HISTSIZE |
历史命令记录数 |
/etc/profile还会引入以下配置文件:
- /etc/inputrc 设定bash热键,tab键有无声音
- /etc/profile.d/*.sh 设定bash操作接口颜色,编码,一些命令的别名
- /etc/sysconfig/i18n 这个是由/etc/profile.d/lang.sh引入的
②用户配置文件
bash读完系统配置后,会读入用户的配置文件,但只会读取这3个配置文件~/.bash_profile或~/.bash_login或~/.profile中的一个,系统会按顺序读取配置文件,如果有一个存在就取存在的那一个。
③总读取流程
所以,系统最终读取的是『~/.bashrc』文件
(3)source 读取环境配置文件
由于/etc/profile和~/.bash_profile都是login shell,如果将用户配置写入上述2个文件,则必须要注销登录后才能生效。source就是用来在用户不注销登录的情况下使配置生效的指令,命令如下:
source或小数点(.) 配置文件
(4)non-login shell读取的配置文件
non-login shell读取的是~/.bashrc,而~/.bashrc又引入了/etc/bashrc。/etc/bashrc定义了如下数据:
- 依据不同的UID规范出umask的值
- 依据不同的UID规范出提示字符PS1
- 引入/etc/profile.d/*.sh的配置
如果不小心删除了~/.bashrc,则可以将/etc/skel/.bashrc复制到用户家目录下,添加相应的别名,再source以下就可以。
(5)其他配置文件
①/etc/man.config
这个档案规定了当使用man时,会去哪个路径下查找man page的路径。如果软件是通过tarball来安装的,那么你的man page是放在/usr/local/软件包名/man里头,这个时候就需要手动将路径加入到/etc/man.config中。
②~/.bash_history 存放历史指令。
③~/.bash_logout 当注销bash时,所做的一些动作,例如备份、清缓存等。
(6)查看终端配置环境命令 stty
stty -a 将目前所有的参数列出来
几个重要参数的意思:
eof |
End of file,表示结束输入 |
erase |
向后删除字符 |
intr |
interrupt中断,送出一个中断信号给目前正在run的程序 |
kill |
删除在目前指令上的所有文字 |
quit |
向正在运行的程序发出一个quit信号 |
start |
在某个程序停止后,重新启动他的output |
stop |
停止目前屏幕的输出 |
susp |
送出一个terminal stop的信号给正在run的程序 |
设定快捷键:stty 参数 快捷键(
^代表ctrl)
(7)set 设置终端机环境配置
set -【uvCHhmBx】
-u 使用未定义变量时,会显示错误信息,默认不启用
-v 信息被输出前,会先显示信息的原始内容,默认不启用
-x 指令被执行前,会显示指令内容,指令前有+号,默认不启用
-h 与历史命令有关,默认启用
-H 与历史命令有关,默认启用
-m 与工作管理有关,默认启用
-B 与[]作用有关,默认启用
-C 使用>时,若文件存在,则文件不会被覆盖
①echo $- 显示所有set设定的值
②取消set设定值使用set +xxxx即可
(8)bash默认的组合键
ctrl+c |
终止目前的命令 |
ctrl+d |
输入结束 |
ctrl+m |
等同于Enter |
ctrl+s |
暂停屏幕输出 |
ctrl+q |
恢复屏幕输出 |
ctrl+u |
删除整行命令 |
ctrl+z |
暂停命令 |
9、通配符与特殊符号
(1)通配符:
* |
代表0到无穷多个任义字符 |
? |
代表有且只有一个任意字符 |
[] |
代表存在一个能与[]中相匹配的字符 |
[-] |
代表在编码顺序内的所有字符,如[0-9a-z] |
[^] |
代表非[]中的字符 |
(2)特殊符号
# |
注释 |
\ |
转义符,将特殊字符转义成一般字符 |
| |
管道符,分隔2个管道命令 |
; |
连续性命令的分隔符 |
~ |
用户家目录 |
$ |
变量前导符 |
& |
工作控制,将指令变成后台进程 |
! |
逻辑运算上的非 |
/ |
目录分隔符 |
>,>> |
输出重定向,分表代表取代与累加 |
<,<< |
输入重定向 |
'' |
单引号,不具有变量置换功能 |
"" |
双引号,具有变量置换功能 |
`` |
反单引号,用来括起可以执行的命令,可以用$() |
() |
子shell的开始与结束 |
{} |
命令区块的组合 |
10、数据流重定向
(1)什么是数据流重定向,就是改变指令原本应该输入的来源或输出返回值的位置,比如将原本应该输出到标准输出流(屏幕上)的内容输出到某个文件中。
重定向标准输入/输出的特殊符号:
标准输入 |
代码为0,使用<和<< |
标准输出 |
代码为1,使用>和>> |
标准错误输出 |
代码为2,使用2>和2>> |
(2)stdout和stderr
使用>或2>将标准输出重定向到文件时,若文件不存在则新建,若文件存在则覆盖文件内容。
使用>>或2>>将标准输出重定向到文件时,若文件不存在则新建,若文件存在则追加文件内容。
如果同时要将正确内容和错误内容分别输出,则可以这样:。。。 > xxx 2> xxx
如果要将正确内容和错误内容输出到同一个地方,则有以下2种方式:
- 。。。 > 目的地 2>&1
- 。。。 &> 目的地
(3)/dev/null 黑洞文件
/dev/null可以丢弃任何导向这个字符设备的信息,如果不想输出错误信息,可以这样
。。。 2> /dev/null
(4)stdin
<就是将原本需要由键盘输入的内容改为使用文件内容,例如cat > xxx < yyy
<<代表的是结束的输入字符,例如cat > xxx << “ccc”当遇到ccc时,停止输入
11、命令执行的判断依据 ;、&&、||
12、管道命令 |
| 后面接的第一个数据必须是一个命令,并且该命令必须能接收标准输入,这样的命令才能称为管道命令,管道命令只能处理由前一个指令传来的正确信息。下面介绍几个管道命令
(1)cut
基于行来处理
cut -d "分隔符" -f 文件
-d 后面接分隔字符,与-f一起使用
-f 后面接数字,表示取出第几段的意思【m,n表示第m和第n;m-n表示m到n;m-表示m到最后】
cut -c 字符区间
-c 以字符的单位取出固定字符区间,用法和-f一样
(2)grep
基于行来处理
grep -【acinv】 【--color】 搜索的字符串 文件名
-a 将二进制文档以text档案的方式搜寻数据
-c 计算找到搜索的字符串的次数
-i 忽略大小写
-n 输出行号
-v 输出不匹配搜索字符串的内容
(3)sort 排序
sort -【fbMnrtuk】 文件名
-f 忽略大小写
-b 忽略最前面的空格符
-M 以月份的名字排序
-n 使用数字进行排序,默认按照字符进行排序
-r 反向排序
-u 去重
-t 分隔符,默认使用tab键分隔
-k 以区间排序,后面接数字
(4)uniq 去重
uniq -【ic】
-i 忽略大小写
-c 计数
(5)wc 计算一个文件有多少字符或多少行
wc -【lwm】
-l 仅列出行
-w 仅列出单词数
-m 列出字符
(6)tee
双向重定向
tee可以将数据流重定向到标准输出流(屏幕)和文件
tee -a 文件名
-a 累加,不加-a表示覆盖
(7)字符转换命令
①tr -【ds】 字符串 。。。
-d 删除文件中的字符串
-s 去重
②col -【xb】
-x 将tab键转换成空格
-b 去除反斜杠
③join -【ti12】 文件1 文件2
④paste -d 文件1 文件2
-d 后面接分隔符,默认是以tab分隔
- 如果文件写成-,代表来自标准输入
⑤expand -t 文件
-t 定义tab键等于多少个空格,默认8个
⑥split -【bl】 文件 前缀
-b 后面接文件大小单位,如b,k,m
-l 以行数进行分割
前缀 文件的前导符
(8)参数替换 xargs
xargs -【0epn】 命令
-0 将特殊字符还原成一般字符
-e 即eof,后面接字符串,当读取到这个时就停止处理
-p 执行前询问
-n 后面接数字,代表执行命令时需要使用几个参数,默认命令是echo
(9)关于减号“-”的用途
在管道命令中,使用“-”可以用来代表输入输出流,在不想生成临时文件时,这种方法很有用,例如:
tar -cvf - /home | tar -xvf -
前面一个“-”代表打包成的stdout,后面一个“-”代表前面的stdin