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