第十一章 认识与学习bash
1 bash shell的功能
- 命令记忆功能
通过在命令行按上下键就可以找到前/后一个输入的命令。 - 命令与文件补齐功能(tab按键)
① tab接在一串命令的第一个字后面,则为命令补全
② tab接在一串命令的第二个字后时,则为文件补齐 - 命令别名设置功能(alias)
① 命令行输入alias就可以知道目前的命令别名有哪些了
② 设置别名: alias lm=‘ls -al’ - type 查看命令是来自外部命令还是内置在bash中。
type [-tpa] name
① 不加任何参数的时候,type会显示出name是外部命令还是bash内置命令
② -t:当加入-t参数时,type会将name以下面这些字眼显示出它的含义
file:表示为外部命令
alias:表示该命令为命令别名所设置的名称
builtin:表示该命令为bash内置的命令功能
③ -p:如果后面接的是外部命令时,才会显示完整文件名
④ -a:会由PATH变量定义的路径中,将所有含name的命令都列出来,包含alias。
2 变量
变量的显示与设置
- 显示:echo $变量名
- 设置:变量名=xxx
设置规则:
(1)变量名与变量内容以一个等号连接,等号两边不能直接接空格符
(2)变量名称只能是英文字母或者数字,但是开头字符不能是数字。
(3)变量内容若有空格符可以使用双引号或者单引号将变量内容结合起来,但是
① 双引号内的特殊字符$等,可以保持原有的特性
若var=“lang is $LANG”,echo $var 结果为lang is en_US
②单引号内的特殊字符则仅为一般字符(纯文本)
若var=‘lang is $LANG’,echo $var 结果为lang is $LANG
(4)可以用转义符号\将特殊字符(如\、空格符、!等)变成一般字符
(5)在一串命令中,还需要通过其他命令提供的信息,可以使用反单引号`命令`或者$(命令)
(6)为变量增加内容时,可以用"$变量名称"或者${变量}累加内容。
PATH="$PATH":/home/bin
(7)若该变量需要在其他子进程中执行,需要引入此变量,如
export PATH
(8)通常大写字符为系统默认,自行设置变量可以使用小写字符。
(9)取消变量的方法为 unset 变量名称
环境变量
- env 查看环境变量与说明
- set 查看所有变量(环境变量和自定义变量)
- export 自定义变量转成环境变量
- locale 显示影响结果的语系变量
键盘读取
read [-pt] 变量名
- 不加任何参数时输入
read atest
键盘输入:this is a test
echo $atest
结果:this is a test - -p 后面可以接提示符
read -p “please enter your name” name
回车后会提示please enter your name 用户输入zhangsan后
echo $name
结果:zhangsan - -t 后面接可以等待的“秒数”
read -p “please enter your name” -t 30 name
设置30s倒计时。
3 历史命令history
-n:列出最近的n条命令
-c:将目前的shell中的所有history内容全部消除
结合hisroty的记录,还有下面的命令可以使用
!number:执行第几条命令的意思(history查找后左边一列是行数)
!command:由最近的命令向前搜寻命令串开头为command的那个命令,并执行
!!:执行上一个命令。
4 数据流重定向
标准输入:< 或<<
标准输出:> 或>>
标准错误输出:2> 或2>>
标准输出或者标准错误输出,当文件不存在时,则创建,若文件存在时,如果使用>则是覆盖以前的文件,如果使用>>则在以前的文件末尾追加内容
- 将正确的输出与错误的输出存入不同文件中
例如:find /home -name .bashrc > list_right 2> list_error
正确的输出被保存在list_right中
错误的输出被保存在list_error中 - /dev/null 垃圾桶黑洞设备
将错误的数据丢弃,屏幕中只打印正确的数据
例如:find /home -name .bashrc 2> dev/null - 将命令的数据全部写入名为list的文件中
find /home -name .bashrc > list 2>&1
或者find /home -name .bashrc &> list - 标准输入的意思简单来说就是将原本需要由键盘输入的数据改由文件内容来替代
cat > catfile < ~/.bashrc 将~/.bashrc 的内容代替键盘输入,内容输出到catfile中 - << 代表结束输入的意思
cat > catfile << “eof”
表示当输入了eof字符后停止输入。
5 命令执行的判断依据
- cmd1;cmd2 不考虑命令相关性的连续命令执行
命令1执行完执行命令2,命令之间没有相关性 - &&与ll
①cmd1 && cmd2
若命令1执行完毕且正确执行,则开始执行命令2
若命令1执行完毕且为错误,则命令2不执行
②cmd1 || cmd2
若命令1执行完毕且正确执行,则命令2不执行
若命令1执行完毕且为错误,则开始执行命令2
6 管道命令
- 管道命令仅会处理标准输出,对于标准错误输出会予以忽略。
- 管道命令必须要能够接收前一个命令的数据成为标准输入继续处理才行
cut 截取部分信息
- cut -d ‘分隔字符’ -f fields
分隔后索引从1开始
①取出PATH的第五个路径
echo $PATH | cut -d ‘:’ -f 5
②取出PATH的第三个和五个路径
echo $PATH | cut -d ‘:’ -f 3,5 - cut -c 字符范围
对于整齐排列的数据格式,可以使用这个命令
①将export输出的信息取每行第12个字符以后的所有字符串
export | cut -c 12-
②将export输出的信息取每行第12个到第20个字符以后的所有字符串
export | cut -c 12-20
grep 匹配后输出全部信息
grep [-acinv] [–color=auto] ‘查找字符串’ filename
-c:计算找到’查找字符串’的次数
-i:忽略大小写
-n:输出行号
-v:反向选择,将不匹配的行输出
–color=auto:查找关键字带颜色显示
sort 排序
使用方法如 cat /etc/passwd | sort
uniq 唯一性
-i:忽略大小写
-c:进行计数
如:使用last将账号列出,仅取出账号列,并进行排序后,展示每个账号的登录次数
last | cut -d ’ ’ -f1 | sort | uniq -c
wc 计算行数、字数、字符数
wc -l:仅展示行数
wc -w:仅展示字数
wc -m:仅展示字符数
tee 双向重定向
同时将数据流(标准输出)送与文件与屏幕。
tee [-a] file
-a:以累加的方式,将数据加入file当中
last | tee last.file | cut -d " " -f1
tr 删除或字符
tr [-ds] set1
-d:删除信息中的set1字符
-s:替换掉重复字符
🌰将last输出的信息中所有的小写字符变成大写字符
last | tr ‘[a-z]’ ‘[A-Z]’
🌰将/etc/passwd输出的信息中的冒号(:)删除
cat /etc/passwd | tr -d ‘:’
col 替换
-x:将tab键替换成对等的空格键
-b:在文字内有反斜杠(/)时,仅保留反斜杠最后接的那个字符
join 将两个文件当中有相同数据的那一行加在一起
paste 将两行贴在一起,且中间以tab键隔开
expand 将tab键转换成空格
split 切割
split [-bl] 被切割文件名 切割后文件名前缀
🌰将/etc/termcap 切分成300KB的文件
split -b 300k /etc/termcap termcap
切分后的文件以termcapaa、termcapab、termcapac这样的方式进行命名。
🌰将使用ls -al /输出的信息中,每10行记录成一个文件。
ls -al / | split -l 10 - lsroot
重点在那个- ,如果需要标准输入输出时,但是偏偏有没有文件,有的只是-时,那么那个-就会被当成标准输入输出
xargs 参数代换
很多命令其实并不支持管道命令,因此我们可以通过xargs来提供该命令引用standard input之用。
也就是说将管道的结果作为xargs后命令的输入。
🌰 find /sbin -perm +7000 | xargs ls -l
将找到的内容作为ls -l的输入,也就是将找到的内容按照ls -l的格式列出。如果没有xargs,ls -l会列出当前目录下的内容,与find命令的结果无关。
减号 -
在管道命令中,经常会使用前一个命令的stdout作为这次的stdin,某些命令需要用到文件名来进行处理,该stdin与stdout可以利用减号 -来替代。
🌰tar -cvf - /home | tar -xvf -
压缩/home路径下的文件,并在当前路径下解压。