1、什么是shell
简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具,用于用户与内核交互的一个工具。内核再操作计算机资源。
2、变量的介绍
2.1 用户登录shell过程
- 当我们通过ssh等工具登录系统时,便获得一个shell(一个bash进程),bash在启动过程中会加载一系列的配置文件,这些配置文件的作用就是为用户准备好bash环境,大部分环境变量都是在这些文件中被设置的。
- 当用户登录之后,读取系统环境变量过程如下:读取并执行文件/etc/profile(此文件会在结尾处判断并执行/etc/profile.d/中所有以.sh结尾的文件);
- 然后按顺序搜索用户家目录下的~/.bash_profile、~/.bash_login和~/.profile(在centos7系统中是文件~/.bash_profile,此文件会进一步判断并执行文件~/.bashrc,然后再进一步判断并执行文件/etc/bashrc)。
- 当一个登录shell登出时(exit),会执行文件~/.bash_logout和/etc/bash.bash_logout(如果文件存在的话)。
- 几个重要的环境变量
- PATH,指定系统当中的命令环境变量
- PS1,系统显示的登录环境变量
- PWD 当前工作目录
- OLDPWD 前一个工作目录
2.2 查看所有的系统预设变量
2.2.1 env
使用 env 命令即可全部列出系统预设的全部系统变量了。不过登录的用户不一样这些环境变量的值也不一样。当前显示的就是root这个账户的环境变量了。
env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来。
2.2.2 set
set不仅可以显示所有系统预设的变量,也可以连同用户自定义的变量显示出来。
3、自定义别名Alias
3.1 在/etc/profile设置alias
#profile最后加上
alias pse="ps -ef"
#执行
source /etc/profile
3.2 /etc/profile自定义环境变量
#profile最后加上
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
然后执行source /etc/profile
4、设置当前用户拥有自己的环境变量
编辑自己家目录下面的~/.bash_profile
5、SHELL特殊变量
bash中还支持一些表示特殊意义的变量,这些变量不能使用上述语句进行赋值。
• $0 本程序所处的进程名,脚本的名称。
• $n n是从1开始的整数,表示当前进程参数,$1表示第一个参数、$2表示第二个参数...$n表示第n个参数。如果n大于10,取值时需要写成${n}的格式。当执行函数时,这些位置变量被临时替换为函数的第一个参数、第二个参数、、、第N个参数。
• $* 表示当前进程的所有参数。$1 $2 ... ${n}。当处于双引号中取值时,所有结果被当成一个整体,即 "$*" 等同于 "$1 $2 ... ${n}"。
• $@ 表示当前进程的所有参数。$1 $2 ... ${n}。当处于双引号中取值时,每个结果被当成单独的单词,即 "$@" 等同于 "$1" "$2" ... "${n}"。参考记
• $# 表示当前进程的参数个数。
• $? 表示前一个命令的返回码,为0表示前一个命令执行成功,非0表示执行失败。
• $$ 表示当前shell的PID。
6、read -p
后面接着变量,并把输入的变量赋值到变量中
read -p "你的名字:" name
echo $name
7、bash需要掌握的一些命令
7.1 cut 用法
语法: cut -d '分隔字符' [-cf] n 这里的n是数字
-d 后面跟分隔字符,这里使用冒号作为分割字符,-f 1 就是截取第一段,-f和1之间的空格可有可无。o
-f :后面接的是第几个区块
-c 后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字
cut -c 1-10 /etc/passwd
cut -d ':' -f 1 /etc/passwd
[root@localhost ~]# head -n2 /etc/passwd | cut -c 1,3,10
7.2 sort
语法: sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2
-t 分隔符 :作用跟cut的-d一个意思
-n :使用纯数字排序
-r :反向排序
-u :去重复
-k :指定哪一个域 ,比如-k 2 第二个域
-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序
如果sort不加任何选项,则从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
-t 后面跟分隔符,-k后面跟数字,表示对第几个区域的字符串排序,-n 则表示使用纯数字排序
[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3,5 -r
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
-k3,5 表示从第3到第5区域间的字符串排序,-r表示反向排序
7.3 wc
7.4 uniq
uniq -c 计算重复的个数(依次计算)
[root@nfs-client ~]# vim c.txt
11
22
22
22
33
44
33
55
55
66
66
[root@nfs-client ~]# uniq -c c.txt
1 11
3 22
1 33
1 44
1 33
2 55
2 66
[root@nfs-client ~]# sort -n c.txt | uniq -c
1 11
3 22
2 33
1 44
2 55
2 66
7.5 tr
替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的^M符号。常用的选项有两个:
-d :删除某个字符,-d 后面跟要删除的字符
-s :把重复的字符去掉
最常用的就是把小写变大写: tr ‘[a-z]’ ‘[A-Z]’
[root@nfs-client ~]# echo "nihao world" | tr '[a-z]' '[A-Z]'
NIHAO WORLD
不过替换、删除以及去重复都是针对一个字符来讲的,有一定局限性。如果是针对一个字符串就不再管用了,所以建议你只需简单了解这个tr即可,以后你还会学到更多可以实现针对字符串操作的工具。
7.6 date
[root@localhost sbin]# date +"%Y-%m-%d %H:%M:%S"
2017-04-21 19:41:01
date在脚本中最常用的几个用法:
data +%Y 以四位数字格式打印年份
date +%y 以两位数字格式打印年份
date +%m 月份
date +%d 日期
date +%H 小时
date +%M 分钟
date +%S 秒
date +%w 星期,如果结果显示0 则表示周日
有时在脚本中会用到一天前的日期:
[root@localhost sbin]# date -d "-1 day" +%d
23
一小时前:
[root@localhost sbin]# date -d "-1 hour" +%H
18
1分钟前:
[root@localhost sbin]# date -d "-1 min" +%M
50
7.7 运算符 ; 和&&和 ||三个符号
command1 ; command2
command1 && command2
command1 || command2
使用 ”;” 时,不管command1是否执行成功都会执行command2;
使用 “&&” 时,只有command1执行成功后,command2才会执行,否则command2不执行;
使用 “||” 时,command1执行成功后command2 不执行,否则去执行command2,总之command1和command2总有一条命令会执行
7.8 expr命令
expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计数器。
$expr 10 + 10
20
$expr 1500 + 900
2500
$expr 30 / 3
10
$expr 30 / 3 / 2
5
(注意运算符左右都有空格 ,如果没有空格表示是字符串连接)
使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义。
$expr 30 * 3
90
7.9 seq 命令
报数
seq 1 10
8、 变量
8.1 变量简单介绍
- 在默认情况下,所有变量都被看做是字符串,并以字符串来存储;
- Shell变量是区分大小写的;
- 在Shell中,通过在变量名前加一个$符号来访问它的内容,无论何时想要获取变量内容,都必须在它前面加一个$符号;
8.2 shell脚本中单引号双引号的区别
shell中的单引号:会显示单引号中的真实内容,不解释变量
shell中的双引号:会解释变量的值
var1=”JellyThink” echo “This is $var1” #输出:This is JellyThinkecho ‘This is $var1’ #输出:This is $var1echo “This is \$var1” #输出:This is $var1