BASH 与 shell 的 概念 与 关系
- Shell (贝壳):命令行
- BASH :Shell 命令行的的一种类型 (各大 Linux 发行版本的默认 Shell)
Shell 命令行的功能:(人 与 计算机硬件 沟通的桥梁 —— ①人找命令行 ②命令行通知内核 ③内核驱动硬件工作)
- 执行命令
- 程序编程
通配符与特殊符号
通配符
- *:代表【0个到无穷多个】任意字符
- ?:代表【一定有一个】任意字符
- []:代表【一定有一个在括号内】的字符
- [-]:代表【在编码顺序内的所有字符】
- [^]:代表【反向选择】
特殊符号
- \:转义符,将【特殊字符或通配符】还原成一般字符
- |:管道符,分隔两个管道命令的符号
- ;:连续执行分隔符
- $:使用变量前导符
- &:任务管理,将命令变成后台任务
- !:逻辑运算意义上的【非】not 的意思
- '':单引号,不具有变量功能
- "":双引号,具有变量功能
- ··:反引号 【·】中间为可先执行命令,也可以用 $()
- ():在中间为子Shell 的起始与结束
- {}:在中间为命令区块的组合
三种引号的应用
1)单引号的用法:单引号中的内容就是纯纯的字符或者字符串,保持原本的样子,任何特殊符号、变量都会变成普通字符。
2)双引号的用法:双引号就是保持各种特殊符号和变量、命令的作用,可以起到隔离字段的作用。
3)反引号的用法:反引号 ·· 中的命令会被优先执行,并且把得到的结果赋值给 list 变量
巧用 Linux 命令行的返回值—— 在 Shell 脚本,中用来判断一行命令是否执行成功
数据流重定向
- 标准输入 (stdin):代码为 0,使用 < 或 <<
- 标准输出(stdout):代码为1,使用 1>(覆盖) 或 1>>(累加)
- 标准错误输出(stderr):代码为 2,使用 2>(覆盖) 或 2>>(累加)
标准输出及错误输出的特殊写法应用
- 2> /dev/null 垃圾黑洞设备 —— 将错误信息忽略掉而不显示或存储
- 2>&1 将正确与错误数据写到同一个文件中
标准输入 —— 将原本需要由键盘输入的数据,改由文件内容来代替
命令执行的判断依据 : ;、&&、||
- cmd ; cmd (不考虑命令相关性的连续命令执行)
- $? (命令返回值) 与 && 或 || (两个命令有依赖性,依赖性主要判断的地方在于前一个命令执行的结果是否正确)
cmd 1 && cmd 2
- 若 cmd 1 执行完毕且正确执行($?=0),则开始执行 cmd 2
- 若 cmd 1 执行完毕且为错误($?≠0),则不执行 cmd 2
cmd 1 || cmd 2
- 若 cmd 1 执行完毕且正确执行($?=0),则不执行 cmd 2
- 若 cmd 1 执行完毕且为错误($?≠0),则开始执行 cmd 2
例:使用 ls 查看目录 /root/abc 是否存在,若存在则用 touch 建立 /root/abc/hehe。
- ls /root/abc && touch /root/abc/hehe
ls: cannot access '/root/abc': No such file or directory # ls 为找到目录,报错。touch 未执行
- mkdir /root/abc # 新建 /root/abc 目录
- ls /root/abc && touch /root/abc/hehe
- ll /root/abc
-rw-r--r-- 1 root root 0 Jul 2 17:56 hehe # ls 找到目录 , touch 执行
例:测试 /root/abc 是否存在,如不存在则予以建立,若存在不做任何操作
- rm -fr /root/abc
- ls /root/abc || mkdir /root/abc
ls: cannot access '/root/abc': No such file or directory
- ll -d /root/abc
drwxr-xr-x 2 root root 6 Jul 2 18:06 /root/abc
例:不清楚 /root/abc 是否存在,但就是要建立 /root/abc/hehe 文件
- ls /root/abc || mkdir /root/abc && touch /root/abc/hehe
管道命令 (pipe)—— BASH 命令执行的输出数据,需要管道命令处理后才能得到想要的格式
- 管道命令仅会处理标准输出 ,对于标准错误会予以忽略
- 管道命令必须要能够接受来自前一个命令数据成为标准输入继续处理才行
注意:让标准错误可以被管道命令使用,用数据重定向 , 让 2>&1 加入命令,即可让 2> 变成 1>
信息选取命令:cut、grep
cut 命令
- -d '分隔字符' -f fields : 根据 -d 的分隔字符将一段信息划分成数段,用 -f 取出第几段
- -c 字符区间 :以字符 (characters)的单位取出固定字符区间;
grep 命令
- -a:将二进制文件以文本文件的方式查找数据
- -c:计算找到 ' 查找字符 ' 的次数
- -i:忽略大小写的不同
- -n:输出行号
- -v:反向选择,即显示出没有 ' 查找字符 ' 的那一行
- --color=auto:将找到的关键字符部分加上颜色
例:将 last 当中,出现 ' root ' 的行选取出,显示
- last | grep 'root'
例:将 last 当中,只要没有 ' root ' 的行就选取出,显示
- last | grep -v 'root'
例 将 last 当中,只要出现 ' root ' 的行就选取出,并且仅取第一栏
- last | grep 'root' | cut -d ' ' -f 1
信息排序命令:sort 、wc 、uniq
sort [ -fbMnrtuk ] [ file or stdin ] 命令 以文字 或 数字 来排序
- -f:忽略大小写差异
- -b:忽略最前面的空格字符部分
- -n:使用 【纯数字】进项排序 (默认以文字形式来排序)
- -r:反向排序
- -u:即 uniq ,相同输出数据,仅出现一行代表
- -t:分隔符号,默认使用 [Tab] 键来分隔
- -k:以哪个区间 (field)来进行排序
- -M:以月份的名字来排序
例:将账号记录 /etc/passwd 进行排序
例:将 password 的内容,以 : 分隔,并以第三栏来排序
例:将 last 输出数据,仅显示账号 ,并加以排序
uniq [ -ic ] 命令 (将重复的行删掉,只显示一个)
- -i:忽略大小写字符的不同
- -c:进行计数
例:使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位,并计算重复数量
- last | cut -d ' ' -f1 | sort | uniq -c
wc [ -l wn ] 命令 计算输出信息的整体数据(文件内含多少字?多少行?多少字符?等)
- -l: 仅列出行
- -w:仅列出多少字(英文字母)
- -m:多少字符
例:/etc/passwd 里面有多少相关字、行、字符数?
- cat /etc/passwd | wc
52 115 2866
例:使用 last 可以输出登录者,但last最后两行并非账号内容,如何以命令串取得登录系统的总人次?
- last | grep [a-zA-Z] | grep -v 'wtmp'|grep -v 'unkown' | \
> grep -v 'reboot'| wc -l
14
test 命令
test = [ ] # [ ] 相当于 test 命令
例: " test $a =$b " = [ "$a" = "$b" ]
test 数字对比
= / !=
- -eq: 等于
- -ne:不等于
- -le:小于等于
- -lt:小于
- -ge:大于等于
- -gt:大于
test 的条件关系
- -a:并且
- -o:或者
test 对空的判定
- -n: nozero 判定内容不为空
- -z: zero 判定内容为空
test 对文件的判定
- -ef:文件节点号是否一致
- -nt:文件1 是不是比文件 2 新
- -ot:文件1 是不是比文件 2 旧
- -d:目录
- -S:套字节
- -L:软连接
- -e:存在
- -f:普通文件
- -b:快设备
- -c:字符设备
例 :编写脚本完成以下条件
file_check.sh 在执行时,①如果脚本未指定检测文件报错 “未指定检测文件,请指定” ,②如果脚本执行后指定文件不存在 ,报错“此文件不存在”,且当文件存在时请检测文件类型,并显示到输出中。