9.Shell基础

本文介绍了Shell的基础知识,包括Shell的概述、脚本执行方式、命令别名、历史命令、通配符、预定义变量、环境变量、位置参数变量等内容。重点讲解了如何定义和使用变量,如用户自定义变量、环境变量、位置参数变量,以及变量的运算和测试。此外,还涉及到了Shell脚本的执行、命令别名的设定和历史命令的查看与调用。文章最后提到了Bash的快捷键配置和登录信息的定制。
摘要由CSDN通过智能技术生成

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/stdin0标准输入
显示器/dev/stdout1标准输出
显示器/dev/stderr2标准错误输出

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*、 @ 、 @、 @#)

位置参数变量作用
$nn为数字,$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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值