Shell基础
一、Shell概述
1、什么是Shell
流程:ls等命令 >>shell >>内核(0101) >>shell>>命令返回结果
2、shell的分类
Linux的标准shell 是bash
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh(Bash和zsh在不同程度上支持csh的语法)。我们可以通过/etc/shells文件来查询Linux支持的Shell。命令如下:
[root@localhost /]# vi /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
二、Shell脚本的执行方式
1.echo命令
[root@localhost~]# echo [选项] [输出内容]
选项:
-e:支持反斜线控制的字符转换(具体参见表11-2)
-n:取消输出后行末的换行符号(就是内容输出后不换行)
例子1:
[root@localhost /]# echo “hao hao xue xi linux”
“hao hao xue xi linux”
#echo的内容就会打印到屏幕上。
例子2:
[root@localhost /]# echo -n “hao hao xue xi linux”
“hao hao xue xi linux”[root@localhost /]#
#如果加入了“-n”选项,输出内容结束后,不会换行直接显示新行的提示符
在echo命令中如果使用了“-e”选项,则可以支持控制字符,如表所示:
例子3:\a输出警告音
[root@localhost /]# echo -e "\\ \a"
\
#这个输出会输出\,同时会在系统音响中输出一声提示音
例子4:\b向左删除
[root@localhost /]# echo -e "ab\bc"
ac
#这个输出中,在b键左侧有“\b”,所以输出时只有ac
例子5:\t制表符;\n换行符
[root@localhost /]# echo -e "a\tb\tc\nd\te\tf\tg"
a b c
d e f g
#我们加入了制表符“\t”和换行符“\n”,所以会按照格式输出
例子6:\0nnn 按照8进制ASCII码表输出字符
[root@localhost /]# echo -e "\0141\t\0142\t\0143\n\0144\t\0145\t\0146\t\0147"
a b c
d e f g
#还是会输出上面的内容,不过是按照八进制ASCII码输出的。
#也就是说141这个八进制,在ASCII码中代表小写的“a”,其他的以此类推。
例子7:\xhh按照16进制ASCII码表输出字符
[root@localhost /]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
a b c
d e f
#如果按照十六进制ASCII码也同样可以输出
例子8:按颜色输出
这条命令会把1234按照红色输出。解释下这个命令**\e[1;** 是标准格式,代表颜色输出开始,\e[0m代表颜色输出结束,31m定义字体颜色是红色。echo能够识别的颜色如下:30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,36m=青色,37m=白色。
[root@localhost /]# echo -e "\e[1;32m 1234 \e[0m"
1234
例子9:背景颜色块输出
这条命令会给1234加入一个绿色的背景。echo可以使用的背景颜色如下:40m=黑色,41m=红色,42m=绿色,43m=黄色,44m=蓝色,45m=洋红,46m=青色,47m=白色。
[root@localhost /]# echo -e "\e[1;41m 1234 \e[0m"
1234
2.Shell脚本的执行方法
[root@localhost /]# vi hello.sh
#!/bin/bash
echo "hello word! "
Shell脚本写好了,那么这个脚本该如何运行呢?在Linux中脚本的执行主要有这样两种种方法:
第一种:赋予执行权限,直接运行
这种方法是最常用的Shell脚本运行方法,也最为直接简单。就是赋予执行权限之后,直接运行。当然运行时可以使用绝对路径,也可以使用相对路径运行。命令如下:
[root@localhost /]# chmod +755 hello.sh
[root@localhost /]# ./hello.sh
hello word!
第二种:通过Bash调用执行脚本
[root@localhost /]# bash hello.sh
hello word!
三、Bash的基本功能
1.历史命令(history)
1)历史命令的查看
[root@localhost~]# history [选项] [历史命令保存文件]
选项:
-c:清空历史命令
-w:把缓存中的历史命令写入历史命令保存文件。如果不手工指定历史命令保存文件,则放入默认历史命令保存文件~/.bash_history中
默认保存1000行数据,需要修改则在如下文件中修改
[root@localhost ~]# vim /etc/profile
...省略部分输出
HISTSIZE=1000
...省略部分输出
我们使用history命令查看的历史命令和~/.bash_history文件中保存的历史命令是不同的。
那是因为当前登录操作的命令并没有直接写入~/.bash_history文件,而是保存在缓存当中的。
需要等当前用户注销之后,缓存中的命令才会写入~/.bash_history文件。
如果我们需要把内存中的命令直接写入~/.bash_history文件,而不等用户注销时再写入,就需要使用“-w”选项了。命令如下:
[root@localhost ~]# history -w
#把缓存中的命令写入~/.bash_history文件中
如果需要清空历史命令,命令如下
[root@localhost ~]# history -c
#清空历史命令sh
2)历史命令的调用
如果想要使用原先的历史命令有这样几种方法:
- 使用上、下箭头调用以前的历史命令
- 使用**“!n”**重复执行第n条历史命令
- 使用**“!!”**重复执行上一条命令
- 使用**“!字串”**重复执行最后一条以该字串开头的命令
- 使用**“!$”**重复上一条命令的最后一个参数
2.命令与文件的补全tab
tab
3.命令别名(alias)
命令格式:
#查询命令别名
[root@localhost ~]# alias
例:查询系统中已经定义好的别名
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
#设定命令别名
[root@localhost ~]# alias 别名=原命令
#定义vim命令的别名是vi
[root@localhost ~]# alias vi='vim'
既然我们说别名的优先级比命令高,那么命令执行时具体的顺序是什么呢?命令执行时的顺序是这样的:
1、第一顺位执行用绝对路径或相对路径执行的命令。
2、第二顺位执行别名。
3、第三顺位执行Bash的内部命令。
4、第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
永久生效
为了让这个别名永久生效,可以把别名写入环境变量配置文件“~/.bashrc”。命令如下:
[root@localhost ~]# vi /root/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias vi='vim'
alias ser='systemctl restart firewall'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
#立即生效命令
[root@localhost ~]# source .bashrc
#或者将source改为. ,含义一样
[root@localhost ~]# . .bashrc
4.Bash常用快捷键(ctrl+字母)
5.输入输出重定向
1)Bash的标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
2)输出重定向
输出标准是输出到显示器上,输出重定向含义:是将命令输出结果由显示到显示器改变到保存到文件中
常用:
正确输出和错误输出同时存放到一个文件夹info
[root@localhost ~]# pwd>>info 2>&1
[root@localhost ~]# pwd&>>info
正确输出和错误输出分别存放到一个文件夹
正确输出到ok错误输出到err
[root@localhost ~]# ls>>ok 2>>err
3)输入重定向
[root@localhost ~]# wc [选项] [文件名]
-c 统计字节数
-w 统计单词数
-l 统计行数
#不加参数默认
[root@localhost ~]# wc /etc/profile
76 253 1820 /etc/profile
行数 单词数 字节数
#输入重定向
[root@localhost ~]# wc < /etc/profile
76 253 1820
#
[root@localhost ~]# wc << 1112 #举例1112开头
> 2
> dsadas
> faf
> 1112 #举例1112结束
3 3 13
[root@localhost ~]# wc << 666 #举例666开头
> 12
> 34
> dyhasifhias
> 666 #举例666结束
3 3 18
6.多命令顺序执行( ; 、&&、||)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXUUbQSr-1603980666789)(9.Shell基础.assets/image-20201009201716459.png)]
;举例
[root@localhost ~]# ls ; date ;cd /etc/
111 222 anaconda-ks.cfg disk1 disk5
2020年 10月 09日 星期五 20:14:29 CST
&&举例
#正确
[root@localhost /]# ls && echo yes
20201003 boot disk1 etc home lib64 mnt proc run srv tmp var
bin dev disk5 hello.sh lib media opt root sbin sys usr
yes
#错误
[root@localhost /]# lss && echo yes
-bash: lss: 未找到命令 #会立即停止执行第二条命令
||举例
[root@localhost /]# lss || echo no
-bash: lss: 未找到命令
no
[root@localhost /]# ls || echo no
20201003 boot disk1 etc home lib64 mnt proc run srv tmp var
bin dev disk5 hello.sh lib media opt root sbin sys usr
实际应用判断命令是否正确
#正确执行输出yes,错误执行输出no
[root@localhost /]# ls && echo yes || echo no
20201003 boot disk1 etc home lib64 mnt proc run srv tmp var
bin dev disk5 hello.sh lib media opt root sbin sys usr
yes
[root@localhost /]# lss && echo yes || echo no
-bash: lss: 未找到命令
no
7.管道符(|)
1)行提取命令gerp
[root@localhost~]# grep [选项] “搜索内容” 文件名
选项:
-A 数字: 列出符合条件的行,并列出后续的n行
-B 数字: 列出符合条件的行,并列出前面的n行
-c: 统计找到的符合条件的字符串的次数
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
--color=auto 搜索出的关键字用颜色显示
举例1:
#查找用户信息文件/etc/passwd中,有多少可以登录的用户
[root@localhost /]# grep "/bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
举例2:
#查找用户信息文件/etc/passwd中,包含root字段的行,并列出后续的3行
[root@localhost /]# grep -A 3 "root" /etc/passwd
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
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
#查找用户信息文件/etc/passwd中,包含root字段的行,并列出前面的5行
[root@localhost /]# grep -B 3 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
#查找用户信息文件/etc/passwd中,可登录的用户,并显示行号
[root@localhost /]# grep -n "/bin/bash" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
##查找用户信息文件/etc/passwd中,不包含/bin/bash的用户,即不可登录的用户(查找伪用户)
[root@localhost /]# grep -v "/bin/bash" /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
2)find与grep的区别
find命令:
find命令是在系统当中搜索符合条件的文件名,如果需要模糊查询,使用通配符进行匹配,搜索时文件名是完全匹配。
#创建abc文件
[root@localhost /]# touch abc
#创建abcd文件
[root@localhost /]# touch abcd
#搜索文件名是abc的文件,只会找到abc文件,而不会找到文件abcd
#虽然abcd文件名中包含abc,但是find是完全匹配,只能和要搜索的数据完全一样,才能找到
[root@localhost /]# find / -name "abc"
/abc
#注意:find命令是可以通过-regex选项识别正则表达式规则的,也就是说find命令可以按照正则表达式规则匹配,而正则表达式是模糊匹配。但是对于初学者而言,find命令和grep命令本身就不好理解,所以我们这里只按照通配符规则来进行find查询。
grep命令:
grep命令是在文件当中搜索符合条件的字符串,如果需要模糊查询,使用正则表达式进行匹配,搜索时字符串是包含匹配。
#在test文件中写入abc
[root@localhost /]# echo abc > test
#在test文件中追加写入abcd
[root@localhost /]# echo abcd >> test
##grep命令查找时,只要数据行中包含有abc,就会都列出
#所以abc和abcd都可以查询到
[root@localhost /]# grep "abc" test
abcd
abc
3)管道符
多命令顺序执行
#查看详细目录信息并分页展示
[root@localhost /]# ll -a | more
总用量 36
dr-xr-xr-x. 20 root root 4096 10月 9 21:12 .
dr-xr-xr-x. 20 root root 4096 10月 9 21:12 ..
drwxr-xr-x. 2 root root 6 10月 3 19:50 20201003
-rw-r--r--. 1 root root 4 10月 9 21:30 abc
-rw-r--r--. 1 root root 0 10月 9 21:03 abcd
lrwxrwxrwx. 1 root root 7 7月 2 01:15 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 7月 8 22:02 boot
drwxr-xr-x. 21 root root 3380 10月 9 20:13 dev
drwxr-xr-x. 2 root root 6 9月 9 20:12 disk1
drwxr-xr-x. 2 root root 6 9月 9 20:12 disk5
drwxr-xr-x. 77 root root 8192 10月 9 20:13 etc
-rwxr-xr-x. 1 root root 32 10月 5 11:10 hello.sh
drwxr-xr-x. 5 root root 174 7月 3 22:50 home
lrwxrwxrwx. 1 root root 7 7月 2 01:15 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 7月 2 01:15 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 4月 11 2018 media
#查询下本地所有网络连接,提取包含ESTABLISHED(已建立连接)的行
[root@localhost /]# netstat -an | grep "ESTABLISHED"
tcp 0 0 192.168.253.177:22 192.168.253.1:44523 ESTABLISHED
#如果想知道具体的网络连接数量,就可以再使用wc命令统计行数
[root@localhost /]# netstat -an | grep "ESTABLISHED" | wc -l
1
#查询进程中tomcat进程
[root@localhost /]# ps -ef |grep tomcat
#查询已安装rpm中的python包
[root@localhost /]# rpm -qa | grep python
python-firewall-0.6.3-8.el7_8.1.noarch
python-pycurl-7.19.0-19.el7.x86_64
dbus-python-1.1.1-9.el7.x86_64
8.通配符( ?、 *、 [] 、[-]、 [^] )
通配符:用于匹配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ETCDt43-1603980666792)(9.Shell基础.assets/image-20201009214714266.png)]
#建立几个测试文件
[root@localhost tmp]# touch abc abcd 012 0abc
[root@localhost tmp]# ls
012 0abc abc abcd
#“*”代表所有文件
[root@localhost tmp]# find . -name "*"
./abc
./abcd
./012
./0abc
[root@localhost tmp]# ls *
012 0abc abc abcd
#“?”匹配任意一个字符所以会匹配0abc
#但是不能匹配abc,因为“?”不能匹配空
[root@localhost tmp]# find . -name "?abc"
./0abc
[root@localhost tmp]# ls ?abc
0abc
#匹配任何以数字开头的文件
[root@localhost tmp]# find . -name "[0-9]*"
./012
./0abc
[root@localhost tmp]# ls [0-9]*
012 0abc
#匹配任何不以数字开头的文件
[root@localhost tmp]# find . -name "[^0-9]*"
./abc
./abcd
[root@localhost tmp]# ls [^0-9]*
abc abcd
*可以匹配0个或多个任意字符
举例
#查找abc以及abcd文件
[root@localhost ~]# ls
abc abcd acc adc aec anaconda-ks.cfg
[root@localhost /]# find . -name "abc*"
./abc
./abcd
#删除某个目录下所有文件
[root@localhost /]# rm -rf /tmp/*
?匹配任意1个字符
举例
[root@localhost ~]# ls
abc abcd acc adc aec anaconda-ks.cfg
[root@localhost ~]# find . -name "a?c"
./abc
./acc
./adc
./aec
[]匹配中括号中任意一个字符
举例
[root@localhost ~]# ls
abc abcd acc adc aec anaconda-ks.cfg
[root@localhost ~]# find . -name "a[bc]c"
./abc
./acc
[-] -代表匹配一个小写字母
[root@localhost ~]# ls
abc abcd acc adc aec anaconda-ks.cfg
[root@localhost ~]# find . -name "a[a-d]c"
./abc
./acc
./adc
[]去反
[root@localhost ~]# ls
abc abcd acc adc aec anaconda-ks.cfg
[root@localhost ~]# find . -name "a[^a-d]c"
./aec
9.Bash中其他特殊符号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b8Po5M58-1603980666794)(9.Shell基础.assets/image-20201010224045604.png)]
1)单引号和双引号
单引号标注输出均为普通符号
‘$’举例
#定义变量name的职为wh
[root@localhost ~]# name=wh
#如果输出使用单引号,则$name按普通字符输出
[root@localhost ~]# echo '$name'
$name
#如果输出使用双引号,则会输出变量 name的职wh
[root@localhost ~]# echo "$name"
wh
‘``’举例
#反引号括起来的命令会正常执行
[root@localhost ~]# echo `date`
2020年 10月 10日 星期六 22:37:40 CST
#如果反引号命令被单引号括起来,那这个命令不会执行,`date`会被当成普通字符输出
[root@localhost ~]# echo '`date`'
`date`
#如果是双引号括起来,那么这个命令会正常执行
[root@localhost ~]# echo "`date`"
2020年 10月 10日 星期六 22:37:59 CST
双引号
‘$’举例
#定义变量name的职为wh
[root@localhost ~]# name=wh
#如果输出使用双引号,则会输出变量 name的职wh
[root@localhost ~]# echo "$name"
wh
‘``’举例
#反引号括起来的命令会正常执行
[root@localhost ~]# echo `date`
2020年 10月 10日 星期六 22:37:40 CST
#如果是双引号括起来,那么这个命令会正常执行
[root@localhost ~]# echo "`date`"
2020年 10月 10日 星期六 22:37:59 CST
2)反引号和$()
#如果命令不用反引号包含,命令不会执行,而是直接输出
[root@localhost ~]# echo date
date
#只有用反引号包括命令,这个命令才会执行
[root@localhost ~]# echo `date`
2020年 10月 10日 星期六 22:42:00 CST
#使用$(命令)的方式也是可以的
[root@localhost ~]# echo $(date)
2020年 10月 10日 星期六 22:42:39 CST
3)小括号、中括号
在介绍小括号和大括号的区别之前,我们先要解释一个概念,那就是父Shell和子Shell。在我们的Bash中,是可以调用新的Bash的,比如:
[root@localhost ~]# bash
这时,我们通过pstree命令查看一下进程数:
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
....省略部分
├─sshd───sshd───bash───bash───pstree
知道了父Shell和子Shell,我们接着解释小括号和大括号的区别。如果是用于一串命令的执行,那么小括号和大括号的主要区别在于
- ()执行一串命令时,需要重新开一个子shell进行执行
- {}执行一串命令时,是在当前shell执行;
- ()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开;
- ()最后一个命令可以不用分号;
- {}最后一个命令要用分号;
- {}的第一个命令和左括号之间必须要有一个空格;
- ()里的各命令不必和括号有空格;
- ()和{}括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令。
#在父Shell中定义变量name的值是wh
[root@localhost ~]# name=wh
#如果用()括起来一串命令,这些命令都可以执行
#给name变量重新赋值,但是这个值只在子Shell中生效
[root@localhost ~]# (name=sxn;echo $name)
sxn
#父Shell中name的值还是wh,而不是sxn
[root@localhost ~]# echo $name
wh
#但是用大括号来进行一串命令的执行时,name变量的修改是直接在父Shell当中的
#注意大括号的格式(第一个命令和左括号之间必须要有一个空格;命令之间用;号隔开;最后一个命令后要用分号;)
[root@localhost ~]# { name=sxn;echo $name; }
sxn
#所以name变量的值已经被修改了
[root@localhost ~]# echo $name
sxn
4)#、&、\转义符
#:注释
$:调用变量值
[root@localhost ~]# name=wh
[root@localhost ~]# echo $name
wh
\:转义符,转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\ 将 输 出 “ 将 输出“ 将输出“”符号,而不当做是变量引用。
[root@localhost ~]# name=wh
[root@localhost ~]# echo \$name
$name
四、Bash的变量和运算符
1.什么是变量
在定义变量时,有一些规则需要遵守:
-
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
-
在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型
-
变量用等号连接值,等号左右两侧不能有空格
-
变量的值如果有空格,需要使用单引号或双引号包括。如:“test=”hello world!””。其中双引号括起来的内容“$”、“\”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符。
-
在变量的值中,可以使用“\”转义符。
-
如果需要增加变量的值,那么可以进行变量值的叠加。
-
变量需要用双引号包含” 变 量 名 ” 或 用 变量名”或用 变量名”或用(变量名)包含变量名。例如:
-
环境变量名建议大写,便于区分。
变量叠加
#叠加变量test,变量值变成了123456
[root@localhost ~]# test=123
[root@localhost ~]# test="$test"456
[root@localhost ~]# echo $test
123456
变量值的叠加可以使用两种格式:“
变
量
名
”
或
变量名”或
变量名”或(变量名)
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。例如:
[root@localhost ~]# test=$(date)
[root@localhost ~]# echo $test
2020年 10月 20日 星期二 20:41:15 CST
2、变量的分类
◇用户自定义变量:这种变量是最常见的变量,由用户自由定义变量名和变量的值。
◇环境变量:这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等。不是太好理解吧,那么大家还记得在Windows中,同一台电脑可以有多个用户登录,而且每个用户都可以定义自己的桌面样式和分辨率,这些其实就是Windows的操作环境,可以当做是Windows的环境变量来理解。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。
◇位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
◇预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
变量分类 | |||
---|---|---|---|
1.用户自定义变量 | 名称:自定义 | 作用:自定义 | 内容:自定义 |
2.环境变量: | |||
1)用户自定义环境变量 | 名称:自定义 | 作用:自定义 | 内容:自定义 |
2)系统自带环境变量 | 名称:确定 | 作用:确定 | 内容:自定义 |
3.位置参数变量 | 名称:确定 | 作用:确定 | 内容:自定义 |
4.预定义变量 | 名称:确定 | 作用:确定 | 内容:自定义 |
3、用户自定义变量
1)、变量定义
#变量名不能用数字开头
[root@localhost ~]# 2name=wanghui
-bash: 2name=wanghui: 未找到命令
#等号左右两侧不能有空格
[root@localhost ~]# name = wanghui
-bash: name: 未找到命令
#变量的值如果有空格,必须用引号包含
[root@localhost ~]# name=wang hui
-bash: hui: 未找到命令
2)、变量调用
#定义变量name
[root@localhost ~]# name=wanghui
#输出变量name的值
[root@localhost ~]# echo $name
wanghui
3)、变量查看 (set)
[root@localhost~]# set [选项]
选项:
-u:如果设定此选项,调用未声明变量时会报错(默认无任何提示)
-x.如果设定此选项,在命令执行之前,会把命令先输出一次
#直接使用set命令,会查询系统中所有的变量,包含用户自定义变量和环境变量
[root@localhost ~]# set
BASH=/bin/bash
...省略部分输出
name=wanghui
test='2020年 10月 20日 星期二 20:41:15 CST'
#当设置了-u选项后,如果调用没有设定的变量会有报错。默认是没有任何输出的。
[root@localhost ~]# set -u
[root@localhost ~]# echo $wanghui
-bash: wanghui: 未绑定变量
#如果设定了-x选项,会在每个命令执行之前,先把命令输出一次(无实际意义)
[root@localhost ~]# set -x
++ printf '\033]0;%s@%s:%s\007' root localhost '~'
[root@localhost ~]# ls
+ ls --color=auto
111 abc abcd abcde acc adc aec anaconda-ks.cfg
++ printf '\033]0;%s@%s:%s\007' root localhost '~'
4)、变量删除 (unset)
[root@localhost~]# unset 变量名
4.环境变量
1)、声明环境变量设置(export)
#使用export声明的变量即是环境变量
[root@localhost ~]# export name=wanghui
[root@localhost ~]# env | grep name
name=wanghui
2)、环境变量删除(unset)
#删除环境变量
[root@localhost ~]# unset name
[root@localhost ~]# env | grep name
3)、环境变量查询(env、set)
env命令和set命令的区别是,set命令可以查看所有变量,而env命令只能查看环境变量。
env命令可以查询到所有的环境变量,可是还有一些变量虽然不是环境变量,却是和Bash操作接口相关的变量,这些变量也对我们的Bashh操作终端起到了重要的作用。这些变量就只能用set命令来查看了,
#env
[root@localhost ~]# env
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
age=18
#set
[root@localhost ~]# set
BASH=/bin/bash
...省略部分输出
name=wanghui
test='2020年 10月 20日 星期二 20:41:15 CST'
4)、PATH环境变量(查找命令路径变量)
系统查找命令的路径
PATH变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个程序名,如果没有写入路径,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误。
#先查询下PATH环境变量的值
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
我们把自己的脚本拷贝到PATH变量定义的路径中,我们自己写的脚本也可以不输入路径而直接运行
#拷贝hello.sh到/bin目录
[root@localhost~]# cp /root/sh/hello /bin/
#hello可以直接执行了
[root@localhost~]# hello
111111111111111
我们也可以修改PATH变量的值,而不是把程序脚本复制到/bin/目录中。我们通过变量的叠加就可以实现了,当然我们这样定义的PATH变量只是临时生效,一旦重启或注销就会消失,如果想要永久生效,需要写入环境变量配置文件,
#在变量PATH的后面,加入/root/sh目录
[root@localhost sh]# PATH="$PATH":/root/sh/
#查询PATH的值,变量叠加生效了
[root@localhost sh]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/sh/
5)、PS1环境变量(命令提示符)
命令提示符设置
#标准提示符
[root@localhost sh]# echo $PS1
[\u@\h \W]\$
PS1是一个很有意思的变量,是用来定义命令行的提示符的,可以安装我们自己的需求来定义自己喜欢的提示符。PS1可以支持以下这些选项
在PS1变量中,如果是可以解释的符号,如“\u”、“\h”等,则显示这个符号的作用。如果是不能解释的符号,如“@”或“空格”,则原符号输出。那么我们修改下PS1变量,看看会出现什么情况吧:
#提示符输出变味了显示完整主机名、以及显示当前所在目录的完整目录(注意用单引号)
[root@localhost.localdomain ~/sh]#PS1='[\u@\H \w]\$ '
[root@localhost.localdomain ~/sh]# ls
[root@localhost.localdomain /home]# cd /home/ldt/
[root@localhost.localdomain /home/ldt]#
6)、LANG语系变量
LANG变量定义了Linux系统的主语系环境,这个变量的默认值是
#默认中文语系
[root@localhost ldt]# echo $LANG
zh_CN.UTF-8
#支持多少语系查看命令为
[root@localhost ldt]# locale -a
...
[root@localhost ldt]# locale -a |wc -l
791
#查看当前语系命令
[root@localhost ldt]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
#centos7默认语系设置
[root@localhost sysconfig]# cat /etc/locale.conf
LANG="zh_CN.UTF-8"
#centos6默认语系查看方式
[root@localhostsrc]# cat /etc/sysconfig/i18n
LANG=”zhCN.UTF-8”
5.位置参数变量( n 、 n、 n、*、 @ 、 @、 @、#)
位置参数变量 | 作用 |
---|---|
$n | n为数字,$0代表命令本身,$1-$9代表第1个到第9个参数,十个以上参数需要用大括号包含,如$10}. |
$* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
1)$n举例
#创建文件
[root@localhost sh]# vi count.sh
#!/bin/bash
#给a变量赋值为$1
a=$1
#给b变量赋值为$2
b=$2
#变量sum的值为变量1和变量2的和
sum=$(( $a+$b))
#输出sum变量
echo $sum
#$0举例,输出命令本身
echo $0
[root@localhost sh]# chmod 755 count.sh
[root@localhost sh]# ./count.sh 22 33
55
./count.sh
2) ∗ 、 *、 ∗、@、$#举例
[root@localhost sh]# vi para.sh
#!/bin/bash
#$*代表所有参数为整体
echo '$*' is $*
#$@代表所有参数区分对待
echo '$@' is $@
#$#代表参数个数
echo '$#' is $#
[root@localhost sh]# chmod 755 para.sh
[root@localhost sh]# ./para.sh 11 22 33 44 55 66
$* is 11 22 33 44 55 66
$@ is 11 22 33 44 55 66
$# is 6
3) ∗ 、 *、 ∗、@区分
[root@localhost sh]# vi para2.sh
#!/bin/bash
#定义for循环,in后面有几个值,for会循环多少次,注意"$*"需要用双引号(调用变量的值)
#Shell把$*的所有参数堪称是一个整体,所以这个循环只会循环1次。
for i in "$*"
do
echo $i
done
echo ===================
#定义for循环,in后面有几个值,for会循环多少次,注意"$@"需要用双引号(调用变量的值)
#Shell把$@的所有参数区分对待,所以这个循环有几个参数会循环多少次
for y in "$@"
do
echo $y
done
[root@localhost sh]# chmod 755 para2.sh
[root@localhost sh]# ./para2.sh 11 22 33 44 55
11 22 33 44 55
===================
11
22
33
44
55
6.预定义变量($?)
主要用到$?判断上一条命令是否正确执行,其余次要
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一$?个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
1)$?
#ls正确执行
[root@localhost sh]# ls
count.sh hello para2.sh para.sh wh
#输出$?,返回值为0,说明上一条命令正确执行
[root@localhost sh]# echo $?
0
#llls不存在此命令
[root@localhost sh]# llls
-bash: llls: 未找到命令
#输出$?,返回值不为0,说明上一条命令未正确执行
[root@localhost sh]# echo $?
127
2)$ 、 、 、!
[root@localhost sh]# vi ydy.sh
#!/bin/bash
#输出当前进程的pid,此pid为执行ydy.sh时生产的进程pid
echo "ydy bl is $$"
#使用find命令在root目录下查找hello.sh,符号&的意思是把命令放入后台执行
find /root -name hell.sh &
#输出后台执行命令的进程id,也就是find的命令的pid
echo "The ydy bl de ht is $!"
[root@localhost sh]# chmod 755 ydy.sh
[root@localhost sh]# ./ydy.sh
ydy bl is 1942
The ydy bl de ht is 1943
7.read接收键盘输入(-p、-t、-n、-s)
[root@localhost ~]# read [参数] [变量名]
参数:
-p “提示信息” 在等待read输入时,输出提示信息
-t 秒数 read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数 read命令只接受指定的字符数,就会执行
-s 隐藏显示 隐藏输入的数据,适用于机密信息的输入
举例
#-p、-t举例
[root@localhost sh]# vi count2.sh
#!/bin/bash
#-t等待30秒,-p输出提示语please input a num1,num2
read -t 30 -p "please input a num1:" num1
read -t 30 -p "please input a num2:" num2
sum=$(($num1 + $num2))
echo $sum
[root@localhost sh]# chmod 755 count2.sh
[root@localhost sh]# ./count2.sh
please input a num1:1
please input a num2:3
4
================================================================
#-n、-s举例
[root@localhost sh]# vi count2.sh
#!/bin/bash
#-t等待30秒,-p输出提示语please input a num1,num2
#指定num1输入两个字符
read -n 2 -t 30 -p "please input a num1:" num1
#换行显示
echo -e
#指定num2隐藏输入数据
read -t 30 -s -p "please input a num2:" num2
echo -e
sum=$(($num1 + $num2))
echo $sum
[root@localhost sh]# chmod 755 count2.sh
[root@localhost sh]# ./count2.sh
please input a num1:12
#隐藏输入45
please input a num2:
45
8.Shell的运算符
1)declare声明变量类型
[root@localhost~] # declare [+/-] [参数] 变量名
[参数]
-:给变量设定类型属性
+:取消变量的类型属性
-a:将变量声明为数组型
-i:将变量声明为整数型(integer)
-r:讲变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,
也不能删除变量,甚至不能通过+r取消只读属性
-x:将变量声明为环境变量
-p:显示指定变量的被声明的类型
举例一:数值运算(declare -i)
#不进行变量声明,系统默认所有都为字符串输出
[root@localhost sh]# a=1
[root@localhost sh]# b=2
[root@localhost sh]# c=$a+$b
[root@localhost sh]# echo $c
1+2
#声明$c为整数型,输出则为a和b的和
[root@localhost sh]# a=1
[root@localhost sh]# b=2
[root@localhost sh]# declare -i c=$a+$b
[root@localhost sh]# echo $c
3
举例二:数组变量类型(declare -a)
**概念:**所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量成为数组的分量,也称为数组的元素,有时也称为下标变量。
**通俗来讲:**变量和数组都是用来保存数据的,只是变量只能赋予一个数据值,一旦重复复制,后一个值就会覆盖前一个值。而数组是可以赋予一组相同类型的数据值。大家可以把变量想象成一个小办公室,这个办公室只能容纳一个人办公,办公室名就是变量名。而数组是一个大办公室,可以容纳很多人同时办公,在这个大办公室办公的每个人是通过不同的座位号来区分的,这个座位号就是数组的下标,而大办公室的名字就是数组名。
#完整数组写法
[root@localhost sh]# declare -a name[0]=wh
#也可将declare -a去掉,默认“变量名[1]”被系统自动识别为数组变量
[root@localhost sh]# name[1]=sxn
[root@localhost sh]# name[2]=hz
#输出数组的内容,如果只写数组名,那么只会输出第一个下标变量
[root@localhost sh]# echo $name
wh
#输出整个数组变量
[root@localhost sh]# echo ${name[*]}
wh sxn hz
举例三:声明环境变量(declare -x)
”declare -x“ = ”export“
declare -x命令把变量声明为环境变量,和export命令的作用是一样的
#declare -x声明test为环境变量
[root@localhost sh]# declare -x test=123
[root@localhost sh]# env |grep test
test=123
举例四:只读属性(declare -r)
注意一旦给变量设定了只读属性,那么这个变量既不能修改变量的值,也不能删除变量,甚至不能使用“+r”选项取消只读属性。命令如下:
#给test赋予只读属性
[root@localhost~]# declare -r test
#test变量的值就不能修改了
[root@localhost~]# test=456
-bash:test:readonlyvariable
#也不能取消只读属性
[root@localhost~]# declare +r test
-bash:declare:test:readonlyvariable
#也不能删除变量
[root@localhost~]# unset test
-bash:unset:test:cannotunset:readonlyvariable
不过还好这个变量只是命令行声明的,所以只要重新登录或重启,这个变量就会消失了。
举例五:查询变量属性(declare -p)和取消变量属性(declare +)
变量属性的查询使用“-p”选项,变量属性的取消使用“+”选项。命令如下:
#test变量是为环境变量-x
[root@localhost sh]# declare -p test
declare -x test="123"
#取消环境变量test
[root@localhost sh]# declare +x test
#test变量已去掉环境变量属性
[root@localhost sh]# declare -p test
declare -- test="123"
#环境变量查询已无test环境变量
[root@localhost sh]# env |test
[root@localhost sh]#
2)数值运算 $((运算式))
使用“$((运算式))”
declare -i
[root@localhost ~]# a=11
[root@localhost ~]# b=22
[root@localhost ~]# declare -i c=$a+$b
[root@localhost ~]# echo $c
33
expr、let数值运算工具
#expr
[root@localhost ~]# d=11
[root@localhost ~]# e=33
#expr 后+号左右必须带空格
[root@localhost ~]# f=$(expr $d + $e)
[root@localhost ~]# echo $f
44
==============================
#let
[root@localhost ~]# a=12
[root@localhost ~]# b=13
[root@localhost ~]# let c=$a+$b
[root@localhost ~]# echo $c
25
[root@localhost ~]# n=20
#变量n的值等于变量本身再加1
[root@localhost ~]# let n+=1
[root@localhost ~]# echo $n
21
3)Shell常用运算符
举例一:加减乘除法
[root@localhost ~]# a=$(((3+2)*8))
[root@localhost ~]# echo $a
40
举例二:取模运算(取余数)
[root@localhost ~]# b=$((14%4))
#14不能被4整除余数是2
[root@localhost ~]# echo $b
2
举例三:逻辑与
[root@localhost ~]# c=$((1&0))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则都是0
[root@localhost ~]# echo $c
0
[root@localhost ~]# c=$((3&5))
[root@localhost ~]# echo $c
1
[root@localhost ~]# c=$((3&0))
[root@localhost ~]# echo $c
0
四则运算脚本(一)
此脚本现阶段编写存在一个问题,无法指定输入num1、2输入的为数字
#!/bin/bash
#提示输入num1
read -t 30 -p "please input num1:" num1
echo -e
#提示输入num1
read -t 30 -p "please input num2:" num2
echo -e
#提示输入oper(符号),且固定输入一个字符串
read -n 1 -t 30 -p "please input oper[+-*/]:" oper
echo -e
#[ == ]判断变量oper,执行输入的符号,对应输出结果,
[ "$oper" == "+" ] && echo "$(($num1 + $num2))" && exit
[ "$oper" == "-" ] && echo "$(($num1 - $num2))" && exit
[ "$oper" == "*" ] && echo "$(($num1 * $num2))" && exit
[ "$oper" == "/" ] && echo "$(($num1 / $num2))" && exit
echo "qing shu ru zhengque yunsuanfu"
9.变量的测试与内容置换(x=${y-new})
常用
变量置换方式 | 变量y没有设置 | 变量y为空制 | 变量y设置值 |
---|---|---|---|
x=${y-新值} | x=新值 | x为空 | x=$y |
#检测x的值 来判断y是否有值,值为是多少
#1.检测x的值,证明y没有值
#不设置y变量
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
new
[root@localhost ~]# set -u
[root@localhost ~]# echo $y
-bash: y: 为绑定变量
#2.检测x的值,证明y有值,但为空
#设置y变量为空
#[root@localhost ~]# y=""
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
空
[root@localhost ~]# echo $y
y=
#3.检测x的值,证明y有值且等于123
#设置y变量=123
#[root@localhost ~]# y=123
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
123
[root@localhost ~]# echo $y
y=123
还有其他测试方法
10.环境变量配置文件
1)source命令
调用环境变量
[root@localhost ~]# source 配置文件
或
[root@localhost ~]#. 配置文件
2)登陆时环境变量配置文件
登陆时剩下的环境变量配置文件
在Linux系统登录时主要生效的环境变量配置文件有以下5个
所有用户登录统一生效有:
/etc/profile
/etc/profile.d/*.sh
只针对登录用户生效
~/.bash_profile
~/.bashrc
/etc/bashrc
(1)/etc/profile
在用户登录过程先调用/etc/profile文件
在这个环境变量配置文件中会定义这些默认环境变量:
-
USER变量:根据登录的用户,给这个变量赋值(就是让USER变量的值是当前用户)。
-
LOGNAME变量:根据USER变量的值,给这个变量赋值。
-
MAIL变量:根据登录的用户,定义用户的邮箱为/var/spool/mail/用户名。
-
PATH变量:根据登录用户的UID是否为0,判断PATH变量是否包含/sbin、/usr/sbin和/usr/local/sbin这三个系统命令目录。
-
HOSTNAME变量:更加主机名,给这个变量赋值。
-
HISTSIZE变量:定义历史命令的保存条数。
-
umask:定义umask默认权限。注意/etc/profile文件中的umask权限是在“有用户登录过程(也就是输入了用户名和密码)”时才会生效。
-
调用/etc/profile.d/*.sh文件,也就是调用/etc/profile.d/目录下所有以.sh结尾的文件。
(2)/etc/profile.d/*.sh
- 调用/etc/profile.d/*.sh文件里最常用的就是lang.sh文件,而这个文件又会调用/etc/sysconfig/i18n文件,/etc/sysconfig/i18n就是我们前面讲过的默认语系配置文件
(3)~/.bash_profile
-
在PATH变量后面加入了“:$HOME/bin”这个目录
-
调用了~/.bashrc文件,
(4)~/.bashrc
- 定义默认别名,自己定义的别名也放入了这个文件
- 由~/.bashrc调用了/etc/bashrc文件
(5)/etc/bashrc
- PS1变量:也就是用户的提示符
- 定义在非登录模式下的umask权限、PATH变量追加值、调用/etc/profile.d/*.sh文件
登录提示-bash-4.1#,证明删除了5个中某个配置文件,直接拷贝一个即可还原
3)注销时生效的环境变量配置文件
在用户退出登录时,只会调用一个环境变量配置文件,就是~/.bash_logout。这个文件默认没有写入任何内容,可是如果我们希望再退出登录时执行一些操作,比如清除历史命令,备份某些数据,就可以把命令写入这个文件。
#logout时才生效
[root@localhost ~]# logout
4)其他配置文件
还有一些环节变量配置文件,最常见的就是~/bashhistory文件,也就是历史命令保存文件
11.Shell登录信息
1)/etc/issue
我们在登录tty1-tty6这六个本地终端时,会有几行的欢迎界面,这些欢迎信息是保存在/etc/issue文件中,重启后生效
[root@localhost ~]# cat /etc/issue
\S
Kernel \r on an \m
2)/etc/issue.net
/etc/issue是在本地终端登录是显示欢迎信息的,如果是远程登录(如ssh远程登录,或telnet远程登录)需要显示欢迎信息,则需要配置/etc/issue.net这个文件了。使用这个文件时由两点需要注意:
首先,在/etc/issue文件中支持的转义符,在/etc/issue.net文件中不能使用。
[root@localhost ~]# vi /etc/issue.net
\S
Kernel \r on an \m
好好学习
其次,ssh远程登录是否显示/etc/issue.net文件中的欢迎信息,是由ssh的配置文件决定的。
如果我们需要ssh远程登录可以查看/etc/issue.net的欢迎信息,那么首先需要修改ssh的配置文件/etc/ssh/sshd_config,加入如下内容:
[root@localhost~]# vi /etc/ssh/sshd_config
…省略部分输出…
#nodefaultbannerpath
#Bannernone
Banner/etc/issue.net
…省略部分输出…
[root@localhost ~]# systemctl restart sshd
再次用ssh或者xshell登录页面就会显示提示信息
3) /etc/motd
/etc/motd是在用户输入用户名和密码,正确登录之后显示欢迎信息。在/etc/motd文件中的欢迎信息,不论是本地登录,还是远程登录都可以显示。
12.定义Bash快捷键
[root@localhost ~]# stty -a
文件,/etc/sysconfig/i18n就是我们前面讲过的默认语系配置文件
(3)~/.bash_profile
-
在PATH变量后面加入了“:$HOME/bin”这个目录
-
调用了~/.bashrc文件,
(4)~/.bashrc
- 定义默认别名,自己定义的别名也放入了这个文件
- 由~/.bashrc调用了/etc/bashrc文件
(5)/etc/bashrc
- PS1变量:也就是用户的提示符
- 定义在非登录模式下的umask权限、PATH变量追加值、调用/etc/profile.d/*.sh文件
登录提示-bash-4.1#,证明删除了5个中某个配置文件,直接拷贝一个即可还原
3)注销时生效的环境变量配置文件
在用户退出登录时,只会调用一个环境变量配置文件,就是~/.bash_logout。这个文件默认没有写入任何内容,可是如果我们希望再退出登录时执行一些操作,比如清除历史命令,备份某些数据,就可以把命令写入这个文件。
#logout时才生效
[root@localhost ~]# logout
4)其他配置文件
还有一些环节变量配置文件,最常见的就是~/bashhistory文件,也就是历史命令保存文件
11.Shell登录信息
1)/etc/issue
我们在登录tty1-tty6这六个本地终端时,会有几行的欢迎界面,这些欢迎信息是保存在/etc/issue文件中,重启后生效
[root@localhost ~]# cat /etc/issue
\S
Kernel \r on an \m
[外链图片转存中…(img-PwM7zjTm-1603980666816)]
2)/etc/issue.net
/etc/issue是在本地终端登录是显示欢迎信息的,如果是远程登录(如ssh远程登录,或telnet远程登录)需要显示欢迎信息,则需要配置/etc/issue.net这个文件了。使用这个文件时由两点需要注意:
首先,在/etc/issue文件中支持的转义符,在/etc/issue.net文件中不能使用。
[root@localhost ~]# vi /etc/issue.net
\S
Kernel \r on an \m
好好学习
其次,ssh远程登录是否显示/etc/issue.net文件中的欢迎信息,是由ssh的配置文件决定的。
如果我们需要ssh远程登录可以查看/etc/issue.net的欢迎信息,那么首先需要修改ssh的配置文件/etc/ssh/sshd_config,加入如下内容:
[root@localhost~]# vi /etc/ssh/sshd_config
…省略部分输出…
#nodefaultbannerpath
#Bannernone
Banner/etc/issue.net
…省略部分输出…
[root@localhost ~]# systemctl restart sshd
再次用ssh或者xshell登录页面就会显示提示信息
3) /etc/motd
/etc/motd是在用户输入用户名和密码,正确登录之后显示欢迎信息。在/etc/motd文件中的欢迎信息,不论是本地登录,还是远程登录都可以显示。
12.定义Bash快捷键
[root@localhost ~]# stty -a