5. bash的基础特性
- Date:
2018-09-02
5.1. 命令历史
- 环境变量
PWD:保存当前目录路径
OLDPWD:保存上一次目录的路径
PATH: 系统环境变量(默认环境变量:)
LANG:系统字符(默认语言en_US.UTF-8)
SHELL:当前用户的Shell类型(默认/bin/bash)
HISTSIZE:命令历史记录的数量(默认1000条)
HISTFILE:报错命令历史的记录文件(用户家目录的.bash_history)
HISTFILESIZ:HISTFILE文件记录历史的条数(默认和HISTSIZE一样1000条)
- history 常用参数
- -d
删除指定的命令
- -c
清空命令
- -a
手工追加当前会话的命令历史到历史文件中去
- 调用历史命令
!#:重复执行第#条命令
!!:重复执行上一条命令
!str:执行指定str开头的命令(最后一个)
控制命令历史的记录方式
- 主要和HISTCONTROL这个环境变量有关(”/etc/profile”)
ignoredups:忽略重复
ignorespace:忽略空白开头
ignoreboth:上面2个都启用
5.2. 补全(命令/路径)
tab键补全
5.3. 文件及目录管理类命令
- 常用命令:
mkdir:创建目录 tree:显示目录树结构 cp:复制 more、less、head:文件内容查看 mv:移动文件位置或者文件重命名 rm:文件/目录删除
5.3.1. mkdir
- 用法
mkdir [option] directoy…
- -p
没有父目录就一起创建了
- -v
显示创建目录过程
- -m
指定权限
1[root@centos6 dirtest]# mkdir -pv /app/dirtest/a/b/c/d
2mkdir: created directory '/app/dirtest/a'
3mkdir: created directory '/app/dirtest/a/b'
4mkdir: created directory '/app/dirtest/a/b/c'
5mkdir: created directory '/app/dirtest/a/b/c/d'
6[root@centos6 dirtest]# mkdir -m 0744 d
7[root@centos6 dirtest]# ls
8a d
9[root@centos6 dirtest]# ll
10total 8
11drwxr-xr-x. 3 root root 4096 Aug 7 06:47 a
12drwxr--r--. 2 root root 4096 Aug 7 06:47 d
5.3.2. tree
用法: tree [option] directory
- -d
只显示目录
- -L
只显示指定的level级别
- -P
只显示匹配指定的路径
5.3.3. 命令行展开
~,{},~username
5.3.4. 命令的执行结果状态
- echo $?
获取上一个命令的执行状态码,如果是0则执行正确结束。非零则为报错提示异常退出。
5.3.5. 文件查看命令
more
less
head
- -n
获取前n行
- -c
获取前n个字符
tail
- -n
获取后n行
- -c
获取后n个字符
- -f
动态显示
5.3.6. cp
用法: cp src dst
情况1:测试src是文件,目标不存在
1[root@centos6 dirtest]# touch a.tx
2[root@centos6 dirtest]# ls
3a a.tx bin d sbin usr x x_m x_n y_m y_n
4[root@centos6 dirtest]# cp a.tx p
5[root@centos6 dirtest]# ll
6total 40
7drwxr-xr-x. 3 root root 4096 Aug 7 06:47 a
8-rw-r--r--. 1 root root 0 Aug 7 07:09 a.tx
9drwxr-xr-x. 2 root root 4096 Aug 7 07:01 bin
10drwxr--r--. 2 root root 4096 Aug 7 06:47 d
11-rw-r--r--. 1 root root 0 Aug 7 07:09 p
12drwxr-xr-x. 2 root root 4096 Aug 7 07:01 sbin
13drwxr-xr-x. 4 root root 4096 Aug 7 07:01 usr
14drwxr-xr-x. 3 root root 4096 Aug 7 06:59 x
15drwxr-xr-x. 2 root root 4096 Aug 7 07:00 x_m
16drwxr-xr-x. 2 root root 4096 Aug 7 07:00 x_n
17drwxr-xr-x. 2 root root 4096 Aug 7 07:00 y_m
18drwxr-xr-x. 2 root root 4096 Aug 7 07:00 y_n
情况2:测试src是文件,dst存在
1[root@centos6 dirtest]# cp a.tx p
2cp: overwrite 'p'? y
3[root@centos6 dirtest]# cp a.tx a
4[root@centos6 dirtest]# ll a
5total 4
6-rw-r--r--. 1 root root 0 Aug 7 07:11 a.tx
7drwxr-xr-x. 3 root root 4096 Aug 7 06:47 b
情况3:测试src是目录,dst不存在
1[root@centos6 dirtest]# cp -r a ap
2[root@centos6 dirtest]# ll
3total 44
4drwxr-xr-x. 3 root root 4096 Aug 7 07:11 a
5drwxr-xr-x. 3 root root 4096 Aug 7 07:12 ap
6-rw-r--r--. 1 root root 0 Aug 7 07:09 a.tx
7drwxr-xr-x. 2 root root 4096 Aug 7 07:01 bin
8drwxr--r--. 2 root root 4096 Aug 7 06:47 d
9-rw-r--r--. 1 root root 0 Aug 7 07:11 p
10drwxr-xr-x. 2 root root 4096 Aug 7 07:01 sbin
11drwxr-xr-x. 4 root root 4096 Aug 7 07:01 usr
12drwxr-xr-x. 3 root root 4096 Aug 7 06:59 x
13drwxr-xr-x. 2 root root 4096 Aug 7 07:00 x_m
14drwxr-xr-x. 2 root root 4096 Aug 7 07:00 x_n
15drwxr-xr-x. 2 root root 4096 Aug 7 07:00 y_m
16drwxr-xr-x. 2 root root 4096 Aug 7 07:00 y_n
17[root@centos6 dirtest]# ll a ap
18a:
19total 4
20-rw-r--r--. 1 root root 0 Aug 7 07:11 a.tx
21drwxr-xr-x. 3 root root 4096 Aug 7 06:47 b
22
23ap:
24total 4
25-rw-r--r--. 1 root root 0 Aug 7 07:12 a.tx
26drwxr-xr-x. 3 root root 4096 Aug 7 07:12 b
情况4:测试src是目录,dst存在
1[root@centos6 dirtest]# cp -r a ap
2[root@centos6 dirtest]# ll ap
3total 8
4drwxr-xr-x. 3 root root 4096 Aug 7 07:14 a
5-rw-r--r--. 1 root root 0 Aug 7 07:12 a.tx
6drwxr-xr-x. 3 root root 4096 Aug 7 07:12 b
7[root@centos6 dirtest]# cd a
8[root@centos6 a]# ls
9a.tx b
10[root@centos6 a]# tree ap
11ap [error opening dir]
12
130 directories, 0 files
14[root@centos6 a]# ls
15a.tx b
16[root@centos6 a]# cd ..
17[root@centos6 dirtest]# ls
18a ap a.tx bin d p sbin usr x x_m x_n y_m y_n
19[root@centos6 dirtest]# tree ap
20ap
21├── a
22│ ├── a.tx
23│ └── b
24│ └── c
25│ └── d
26├── a.tx
27└── b
28 └── c
29 └── d
30
317 directories, 2 files
- mv
文件移动/重命名
- rm
删除文件及目录(删除空目录也可以用rmdir)
- -i
交互
- -f
强制
- -r
递归
5.4. 命令别名
alias cdnet=”cd /etc/sysconfig/network-scripts”
针对用户的别名: “~/.bashrc”
针对系统的别名:”/etc/bashrc”
重读配置文件:source /path/to/config.file
unalias:撤销别名
5.5. bash快捷键盘
ctrl+L:作用和clear命令相同。清空当前屏幕输出内容。然后把光标移动到屏幕最上方。
ctrl+a:把光标移动到输入内容的最左侧(开始的位置)。
ctrl+e:把光标移动到出入内容的最右侧。
ctrl+u:清除剪切光标之前的内容
ctrl+k: 清除剪切光标及光标之后的内容
5.6. bash重定向(i/o)
- 重定向分为以下几种:
>:覆盖输出重定向,会覆盖文件原有内容。从第一行开始覆盖。
>>:追加输出重定向,会追加到文件末尾。
2>:错误输出
2>>:错误追加
> a.txt 2 > &1:标准输出覆盖输出到a.txt。如果a.txt文件原来有内容则覆盖,并把标准错误重定向到标准输出。
>>a.txt 2>> &1:标准输出追加到a.txt,标准错误追加输出到标准输出。
tr
1[root@centos6 dirtest]# tr 'a-z' 'A-Z' < /etc/fstab
2
3#
4# /ETC/FSTAB
5# CREATED BY ANACONDA ON TUE NOV 7 15:31:40 2017
6#
7# ACCESSIBLE FILESYSTEMS, BY REFERENCE, ARE MAINTAINED UNDER '/DEV/DISK'
8# SEE MAN PAGES FSTAB(5), FINDFS(8), MOUNT(8) AND/OR BLKID(8) FOR MORE INFO
9#
10UUID=AA4C5795-C48C-4E21-B5A2-31198C603E8D / EXT4 DEFAULTS 1 1
11UUID=0733A859-9567-48D3-88B1-B8D1FBEBBBA0 /APP EXT4 DEFAULTS 1 2
12UUID=53B38D7C-322C-484D-B108-5C8191251531 /BOOT EXT4 DEFAULTS 1 2
13UUID=38651A9B-10AB-4218-960B-D0EBB9CBAA54 SWAP SWAP DEFAULTS 0 0
14TMPFS /DEV/SHM TMPFS DEFAULTS 0 0
15DEVPTS /DEV/PTS DEVPTS GID=5,MODE=620 0 0
16SYSFS /SYS SYSFS DEFAULTS 0 0
17PROC /PROC PROC DEFAULTS 0 0
5.7. 文本处理工具
文件处理一般常用命令及常用参数包括:
- wc
- -l
行数
- -c
字符数量
- -w
单词个数
- cut
- -d
分割符号
- -f
提取
- sort
- -f
忽略大小写
- -k
指定字段排序
- -t
分割
- -n
数字排序
- -u
去重连续的重复
- -r
逆序
- uniq
- -c
显示重复的次数
- -d
只显示重复的行
- -u
只显示不重复的行
5.8. 编程环境
- shell脚本的组成部分
关键字、控制语句:if…else…,for,do…done
shell命令,例如:echo,exit等
文本处理命令,例如:awk,grep,cut,sed等
函数
- 编程变量种类
本地变量: 仅仅在当前的shell生效
环境变量: 在当前和子shell生效
局部变量: shell进程某代码片段
位置变量: $1,$2来表示,用与获取脚本接受的参数
特殊变量: 一些特殊变量
- 特殊变量如下
$?:上一个命令的执行返回码
$#:参数个数
$*:参数
$0:命令本身
$@:所有参数
- 本地变量:
name=’value’
- 环境变量:
export name=value,declare -x name=value
- 查看环境变量:
env,export,printenv变量
5.8.1. bash的配置文件
- 全局配置文件
/etc/profile
/etc/profile.d/*.sh
- 个人的配置文件
~/.bash_profile
~/.bashrc
- profile:
用于定义环境变量和脚本
- bashrc:
用于定义命令别名和本地变量
- 算数运算
let a=expr
$[expr]
$((expr))
expr a1 op a2
运算符使用举例:
1[root@centos6 x]# let a=10
2[root@centos6 x]# $[10+20]
3-bash: 30: command not found
4[root@centos6 x]# echo $[10+20]
530
6[root@centos6 x]# echo $((10+20))
730
8[root@centos6 x]# echo `expr 10 + 20`
930
- 条件测试
test expr
[ expr ]
[[ expr ]]
1[ -f "somefile" ] 判断是否是一个文件
2[ -x "/bin/ls" ] 判断/bin/ls是否存在并有可执行权限
3[ -n "$var" ] 判断$var变量是否有值
4[ "$a" = "$b" ] 判断$a和$b是否相等
5-r file 用户可读为真
6-w file 用户可写为真
7-x file 用户可执行为真
8-f file 文件为正规文件为真
9-d file 文件为目录为真
10-c file 文件为字符特殊文件为真
11-b file 文件为块特殊文件为真
12-s file 文件大小非0时为真
13-t file 当文件描述符(默认为1)指定的设备为终端时为真
14
15-ne 比较两个参数是否不相等
16-lt 参数1是否小于参数2
17-le 参数1是否小于等于参数2
18-gt 参数1是否大于参数2
19-ge 参数1是否大于等于参数2
20-f 检查某文件是否存在(例如,if [ -f "filename" ])
21-d 检查目录是否存在
22
23补充:文件测试操作:
24返回true,如果:
25-e file 文件存在
26-a file 文件存在(已被弃用)
27-f file 被测文件是一个regular文件(正常文件,非目录或设备)
28-s file 文件长度不为0
29-d dir 被测对象是目录
30-b file 被测对象是块设备
31-c file 被测对象是字符设备
32-p file 被测对象是管道
33-h file 被测文件是符号连接
34-L file 被测文件是符号连接
35-S(大写) file 被测文件是一个socket
36-t 关联到一个终端设备的文件描述符。用来检测脚本的stdin[-t0]或[-t1]是一个终端
37-r 文件具有读权限,针对运行脚本的用户
38-w 文件具有写权限,针对运行脚本的用户
39-x 文件具有执行权限,针对运行脚本的用户
40-u set-user-id(suid)标志到文件,即普通用户可以使用的root权限文件,通过chmod +s file实现
41-k 设置粘贴位
42-O 运行脚本的用户是文件的所有者
43-G 文件的group-id和运行脚本的用户相同
44-N 从文件最后被阅读到现在,是否被修改
45f1 -nt f2 文件f1是否比f2新
46f1 -ot f2 文件f1是否比f2旧
47f1 -ef f2 文件f1和f2是否硬连接到同一个文件
48
49二元比较操作符,比较变量或比较数字
50
51整数比较:
52-eq 等于 if [ "$a" -eq "$b" ]
53-ne 不等于 if [ "$a" -ne "$b" ]
54-gt 大于 if [ "$a" -gt "$b" ]
55-ge 大于等于 if [ "$a" -ge "$b" ]
56-lt 小于 if [ "$a" -lt "$b" ]
57-le 小于等于 if [ "$a" -le "$b" ]
58
59< 小于(需要双括号) (( "$a" < "$b" ))
60<= 小于等于(...) (( "$a" <= "$b" ))
61> 大于(...) (( "$a" > "$b" ))
62>= 大于等于(...) (( "$a" >= "$b" ))
63
64字符串比较:
65= 等于 if [ "$a" = "$b" ]
66== 与=等价
67!= 不等于 if [ "$a" = "$b" ]
68< 小于,在ASCII字母中的顺序:
69 if [[ "$a" < "$b" ]]
70 if [ "$a" \< "$b" ] #需要对<进行转义
71> 大于
72
73-z 字符串为null,即长度为0
74-n 字符串不为null,即长度不为0
- 语句控制
if
1if expr ; then
2 sate
3fi
for
1for var in [] ; do
2 sate
3done