七、shell变量
变量命名规则
- 变量名必须以字母或下划线打头,名字中间只能由字母、数字和下划线组成
- 变量名在有效范围内必须是唯一的
变量的分类
- 用户自定义变量
- 环境变量:主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的。
- 位置参数变量:主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
1、用户自定义变量
定义变量
- 变量名=变量值
- 例如:x=5
- 例如:name="yuan ke"
变量的调用
- echo $变量名
- 例如:echo $x
- 例如:echo $name
[root@localhost ~]# x=5
[root@localhost ~]# name="yuan ke"
[root@localhost ~]# echo $name
yuan ke
[root@localhost ~]# echo $x
5
变量的叠加
- x=123
- x="$x"456
[root@localhost ~]# x=123
[root@localhost ~]# echo $x
123
[root@localhost ~]# x="$x"456
[root@localhost ~]# echo $x
123456
变量的查看
set 查看系统下所有已经生效的变量,包括系统的环境变量和用户自定义变量。
-u 选项 执行 set -u 命令以后,如果调用没有声明的变量时会报错。
[root@localhost ~]# set | less
name='yuan ke'
x=123456
[root@localhost ~]# echo $a ······没有给s设置变量,没有任何提示
[root@localhost ~]# set -u ······执行命令后
[root@localhost ~]# echo $a
-bash: a: 未绑定变量 ······系统会提示没有绑定变量
变量删除
unset 变量名
[root@localhost ~]# unset name
[root@localhost ~]# set | name
-bash: name: 未找到命令
2、环境变量
source 命令
source 环境变量配置文件名 或者 . 环境变量配置文件名
# 修改配置文件后,必须注销重新登录才能生效,使用source 命令可以不用重新登录
环境变量配置文件
PATH、HISTSIZE、PS1、HOSTNAME等环境变量写入对应的环境变量配置文件
环境变量配置文件中主要是定义对系统操作环境生效的系统默认的环境变量,如PATH等。
- /etc/profile 用户环境变量,交互登录才执行
- /etc/bashrc 用户不用登录,执行shell就生效
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- ~/.bash_history
- ~/.bash_logout 用户退出后需要做的一些操作
在/etc/目录下的配置文件会对所有用户生效,放在家目录的配置文件,只会对当前用户生效。
PS1=[\u@\h \W]$
修改用户 主机名 家目录等信息
[root@localhost ~]# PS1='[\u@\h \w]\$'
[root@localhost ~]#cd data/
[root@localhost ~/data]#
[root@localhost ~/data]#PS1='<\u@\h \W>\$'
<root@localhost data>#
shell 特殊符号
- *匹配任意内容
- ?匹配任意一个内容
- [] 匹配中括号中的一个字符
- #注释字符
- \ 脱义字符
- | 管道符
\ 脱义字符
[root@localhost ~]#a=1
[root@localhost ~]#b=2
[root@localhost ~]#c=$a$b
[root@localhost ~]#echo $c
12
[root@localhost ~]#c='$a$b'
[root@localhost ~]#echo $c
$a$b
[root@localhost ~]#c=$a$b
[root@localhost ~]#c=\$a\$b
[root@localhost ~]#echo $c
$a$b
和管道有关的命令
- cut 分割,-d分隔符 -f 指定段号 -c 指定第几个字符
[root@localhost ~]#cat /etc/passwd | head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]#cat /etc/passwd | head -2 | cut -d ":" -f 1
root
bin
[root@localhost ~]#cat /etc/passwd | head -2 | cut -d ":" -f 1,2
root:x
bin:x
[root@localhost ~]#cat /etc/passwd | head -2 | cut -d ":" -f 1-3
root:x:0
bin:x:1
- sort 排序,-n 以数字排序 -r 反序 -t 分隔符 -kn1/-kn1,n2
[root@localhost ~]#sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@localhost ~]#sort 1.txt
<
>
,
[
]
\
111
.123
222
333
aaa
adm:x:3:4:adm:/var/adm:/sbin/nologin
bbb
bin:x:1:1:bin:/bin:/sbin/nologin
ccc
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
以数字的顺序排序
[root@localhost ~]#sort -n 1.txt
<
>
,
[
]
\
aaa
adm:x:3:4:adm:/var/adm:/sbin/nologin
bbb
bin:x:1:1:bin:/bin:/sbin/nologin
ccc
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
.123
111
222
333
# 需要注意的是按数字顺序排序的时候数字前面的字母默认是0
- wc -l 统计行数 -m 统计字符数 -w 统计词
[root@localhost ~]#cat /etc/passwd | wc -l
20
[root@localhost ~]#cat /etc/passwd | wc -m
908
[root@localhost ~]#cat /etc/passwd | wc -c
908
- uniq 去重 -c 统计行数
[root@localhost ~]#cat 2.txt
111
222
333
123
123
aaa
bbb
ccc
ddd
abc
abc
[root@localhost ~]#sort 2.txt |uniq -c
1 111
2 123
1 222
1 333
1 aaa
2 abc
1 bbb
1 ccc
1 ddd
- tee 和> 类似,重定向的同时还在屏幕上显示, -a追加
[root@localhost ~]#sort 2.txt | uniq -c | tee a.txt
1 111
2 123
1 222
1 333
1 aaa
2 abc
1 bbb
1 ccc
1 ddd
[root@localhost ~]#cat a.txt
1 111
2 123
1 222
1 333
1 aaa
2 abc
1 bbb
1 ccc
1 ddd
- tr 替换字符,tr 'a''b',大小写替换tr '[a-z]' '[A-Z]'
[root@localhost ~]#echo "xuexi" | tr 'x' 'X'
XueXi
- split 切割,-b 大小(默认单位字节),-l行数
特殊符号
- $ 变量前缀,!$组合,正则里面表示行尾
- ;多条命令写到一行,用分号分割
- ~用户家目录,后面正则表达式表示匹配符
- &放到命令后面 会把命令丢到后台
- #> >> 2> 2>> &>
- []指定字符中的一个,[0-9],[a-zA-Z],[abc]
- || 和 &&,用于命令之间
[root@localhost ~]#ls 1.txt ; wc -l 2.txt
1.txt
11 2.txt
|| 表示或,如果第一条命令执行正确,第二条命令则不执行。如果第一条命令执行错误,则执行第二条命令。
[root@localhost ~]#ls 123.txt || wc -l 2.txt
ls: 无法访问123.txt: 没有那个文件或目录
11 2.txt
[root@localhost ~]#ls 1.txt || wc -l 2.txt
1.txt
&& 如果第一条命令执行成功了才执行第二条命令,如果第一条命令错误,第二条命令则不执行。
[root@localhost ~]#ls 1.txt && wc -l 2.txt
1.txt
11 2.txt
[root@localhost ~]#ls 123.txt && wc -l 2.txt
ls: 无法访问123.txt: 没有那个文件或目录