shell基础

一、shell脚本的执行方式

1. echo 命令

[root@centos2 ~]# echo [选项] [输出内容]
选项
    -e:支持反斜线控制的字符装换
    -n:取消输出后行末的换行符,就是内容输出后不换行

[root@centos2 ~]# echo "hello world"
hello world
[root@centos2 ~]# echo -n "hello world"
hello world[root@centos2 ~]# 

在echo命令中使用"-e"选项,可控制以下字符

控制字符                  作       用
\                        输出本身
a                        输出警告音
                        退格键,向左删除
c                        取消输出行末的换行符,和"-n"选项作用一致
e                        ESCAPE键
f                        换页符

                        换行符

                        回车符
	                        制表符,tab键
v                        垂直制表符
nnn                    按照八进制ASCII码表输出字符。0为数字零,nnn是三位八进制数
xhh                      按照十六进制ASCII码表输出字符。其中hh是两位十六进制数

[root@centos2 ~]# echo -e "\ a"
 
#输出,同时会输出一声提示音
[root@centos2
~]# echo -e "abc" ac [root@centos2 ~]# echo -e "abcc" abc[root@centos2 ~]# [root@centos2 ~]# echo -e "afbfcf" a b c [root@centos2 ~]# echo -e "a b c " a b c [root@centos2 ~]# echo -e "141 142 143 144 145 146" a b c d e f

 [root@centos2 ~]# echo -e "141 142 143 144 145 146"
  a   b   c
  d   e   f

#我们加入了制表符“	”和换行符“
”,所以会按照格式输出
[root@centos2
~]# echo -e "x61 x62 x63 x64 x65 x66" a b c d e f

在输出内容时,echo还能赋予其颜色

root@centos2 ~]# echo -e "e[1;31m abc e[0m"

#这条命令会把abc按照红色输出。

这个命令e[1 是标准格式,代表颜色输出开始,e[0m 代表颜色输出结束,31m定义字体颜色是红色,31m定义字体颜色是红色。

echo能够识别的颜色如下:30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=杨红,36m=青色,37m=白色。

[root@centos2 ~]# echo -e "e[1;41m abc e[0"
 abc 

这条命令会给abc加入一个红色的背景。echo可以使用的背景颜色如下:40m=黑色,41m=红色,42m=绿色,43m=黄色,44m=蓝色,45m=洋红,46m=青色,47m=白色。

 2. shell脚本执行的方式

#!/bin/bash

echo -e "hello world"
[root@centos2 ~]# chmod +x hello.sh 
# chmod 755 hello.sh
#赋予执行权限

通过bash调用 [root@centos2
~]# bash hello.sh hello world
直接运行,绝对路径,相对路径都可 [root@centos2
~]# /root/hello.sh hello world [root@centos2 ~]# ./hello.sh hello world

 二、bash的基本功能

1. 历史命令

1.1 历史命令查看

[root@centos2 ~]# history [选项] [历史命令保存文件]
选项
    -c:清空历史命令
    -w:把缓存中的历史命令写入到历史命令保存文件。如果不手动指定保存文件,则放入默认的历史命令保存文件内~/.bash_history中
[root@centos2 ~]# vim /etc/profile
...
HISTSIZE=1000
...

使用history命令查看的历史命令和~/.bash_history文件中保存的历史命令是不同的。那是因为当前登录操作的命令并没有直接写入到~/.bash_history文件,而是保存在缓存中。需要当前用户注销后,缓存中的命令才会写入到~/.bash_history文件。如果需要把缓存中的命令直接写入文件中,需要使用"-w"选项

[root@centos2 ~]# history -w
#把缓存中的历史命令直接写入~/.bash_history

之后再去查询~/.bash_history文件,历史命令就和history命令查询的一致了

如果需要清空历史命令,只需执行:

[root@centos2 ~]# history -c
#清空历史命令

1.2 历史命令的调用

如果想要使用之前的历史命令有以下几种方法:

  使用↑、↓ 调用之前的命令

  使用"!n"重复执行第n条历史命令

  使用"!!" 重复执行上一条命令

  使用"!字串"重复执行最后一条以该字串开头的命令

  使用"!$"重复上一条命令的最后一个参数

2. 命令与文件的补全

tab键

3. 命令别名

[root@centos2 ~]# alias
#查询别名

alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -laF'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias now='date +%Y%m%d%H%M%S'
alias rm='rm -i'
alias sudo='sudo '
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'


[root@centos2 ~]# alias 别名='原名'
#设定别名

别名的优先级比命令高。命令执行时的顺序如下:

  第一顺位执行用绝对路径或相对路径执行的命令

  第二顺位执行别名

  第三顺位执行bash的内部命令

  第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

为了让别名永久生效,可以把别名写入环境变量配置文件。

4. bash常用快捷键

ctrl+A            把光标移动到命令行开头。如果输入的命令过长,想要把光标移动到命令行开头时使用
ctrl+E            把光标移动到命令行结尾
ctrl+C            强制终止当前的命令
ctrl+L            清屏,相当于clear
ctrl+U            删除或剪切光标之前的命令。输入一行很长的命令,不使用退格键一个一个字符的删,使用这个快捷键
ctrl+K            删除或剪切光标之后的内容
ctrl+Y            粘贴ctrl+U或ctrl+K剪切的内容
ctrl+R            在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
ctrl+D            退出当前终端
ctrl+Z            暂停,并放入后台。
ctrl+S            暂停屏幕输出
ctrl+Q            恢复屏幕输出

5. 输入输出重定向

5.1 bash的标准输入输出

    设备            设备文件名            文件描述符            类型
    键盘           /dev/stdin               0                  标准输入
   显示器          /dev/stdout              1                  标准输出
   显示器          /dev/stderr              2               标准错误输出

5.2 输出重定向

类型 符号 作用
标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备中。
命令>> 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备中。
标准错误输出重定向 错误命令 2>文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备中。
错误命令 2>>文件 以追加的方式,把命令的错误输出输出到指定的文件或设备中。
正确输出和错误输出同时保存 命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中。
命令 >> 文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件中。
命令 &>文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中。
命令 &>>文件 以追加的方式,把正确输出和错误输出都保存到同一个文件中。
命令>>文件1 2>>文件2 把正确的文件输出追加到文件1中,把错误的输出追加到文件2中

        

5.3 输入重定向

[root@centos2 ~]# wc [选项] [文件名]
选项
    -c            统计字节数
    -w            统计单词数
    -l            统计行数

6. 多命令顺序执行

多命令执行符 格式 作用
命令1 ; 命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1 && 命令2

当命令1正确执行($?=0),则命令2执行

当命令1执行出错($?≠0),则命令2不会执行

|| 命令1 || 命令2

当命令1执行出错($?≠0),则命令2执行

当命令1正确执行($?=0),则命令2不会执行

7. 管道符

7.1 行提取命令grep

[root@centos2 ~]# grep [选项] "搜索内容" 文件名
选项
    -A 数字            列出符合条件的行,并列出后续的n行
    -B 数字            列出符合条件的行,并列出前面的n行
    -c                    统计找到的符合条件的字符串的次数
    -i                    忽略大小写
    -n                    输出行号
    -v                    反向查找
    --color=auto    搜索出的关键字用颜色显示

[root@centos2 ~]# grep -A 3 "/bin/bash" /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
--
shw:x:1000:1000:shw:/home/shw:/bin/bash
sss:x:1001:1002::/home/sss:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@centos2
~]# grep -n "/bin/bash" /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 44:shw:x:1000:1000:shw:/home/shw:/bin/bash 45:sss:x:1001:1002::/home/sss:/bin/bash
[root@centos2
~]# grep -nv "/bin/bash" /etc/passwd 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ...

7.2 find和grep的区别

  find命令是在系统中搜索符合条件的文件名,如果需要模糊查询,使用统配符进行匹配,搜索时文件名是完全匹配

  find命令是可以通过-regex选项识别正则表达式规则。

   grep命令是在文件中搜索符合条件的字符串,如果需要模糊查询,使用正则表达式进行匹配,搜索时字符串是包含匹配。

[root@centos2 ~]# echo abc > test

[root@centos2 ~]# echo abcd >> test
[root@centos2 ~]# grep "abc" test
abc
abcd

#grep命令查找时,只要数据行中包含有abc,就会都列出

7.3 管道符

[root@centos2 ~]# ll /etc | more
total 1476
drwxr-xr-x.  3 root root      101 Nov  6 20:21 abrt
-rw-r--r--   1 root root       16 Nov  6 20:21 adjtime
-rw-r--r--   1 root root     1518 Nov  6 20:21 aliases
-rw-r--r--   1 root root    12288 Nov 12 00:02 aliases.db
drwxr-xr-x.  3 root root       65 Nov  6 20:21 alsa
drwxr-xr-x.  2 root root     4096 Nov  6 20:21 alternatives
-rw-------   1 root root      538 Nov 14 00:40 anacrontab
-rw-r--r--   1 root root       55 Nov  6 20:21 asound.conf
-rw-r--r--   1 root root        1 Nov  6 20:21 at.deny
drwxr-x---.  3 root root       43 Nov  6 20:21 audisp
drwxr-x---.  3 root root       83 Nov  6 20:21 audit
-rw-r--r--   1 root root    14781 Nov  6 20:21 autofs.conf
-rw-------   1 root root      232 Nov  6 20:21 autofs_ldap_auth.conf
-rw-r--r--   1 root root      795 Nov  6 20:21 auto.master
drwxr-xr-x.  2 root root        6 Aug  8 20:06 auto.master.d
-rw-r--r--   1 root root      524 Nov  6 20:21 auto.misc
-rwxr-xr-x   1 root root     1260 Nov  6 20:21 auto.net
-rwxr-xr-x   1 root root      687 Nov  6 20:21 auto.smb
drwxr-xr-x.  4 root root       71 Nov  6 20:21 avahi
drwxr-xr-x.  2 root root     4096 Nov  6 20:21 bash_completion.d
-rw-r--r--   1 root root     2853 Nov  6 20:21 bashrc
drwxr-xr-x.  2 root root        6 Oct 19 00:48 binfmt.d
drwxr-xr-x.  2 root root       23 Nov  6 20:21 bluetooth
drwxr-xr-x.  2 root root    12288 Nov  6 20:21 brltty
-rw-r--r--   1 root root    21929 Nov  6 20:21 brltty.conf
-rw-r--r--   1 root root       37 Nov  6 20:21 centos-release
--More--
[root@centos2 ~]# netstat -an | grep "ESTABLISHED"
tcp        0     52 192.168.80.129:22       192.168.80.1:63373      ESTABLISHED
#查询本地所有网络连接,提取包含“ESTABLISHED”(已建立连接)的行,
#就可以知道我们的服务器上有多少已经成功连接的网络连接
[root@centos2 ~]# netstat -an | grep "ESTABLISHED" | wc -l
1
#使用wc命令统计行数,以查看具体的网络连接数量
[root@centos2 ~]# rpm -qa |grep httpd
httpd-tools-2.4.6-90.el7.centos.x86_64
httpd-2.4.6-90.el7.centos.x86_64

8. 通配符

?             匹配一个任意字符
*              匹配0个或任意多个任意字符,也就是可以匹配任何内容
[]            匹配中括号中的任意一个字符。例如[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c。
[-]            匹配中括号中任意一个字符,"-"代表一个范围。例如[a-z]代表匹配一个小写字母。
[^]            逻辑非,表示匹配不是中括号内的一个字符。例如[^0-9]代表匹配一个不是数字的字符
[root@centos2 ~/test]# ll *
-rw-r--r-- 1 root root 0 Nov 21 23:18 012
-rw-r--r-- 1 root root 0 Nov 21 23:18 0abc
-rw-r--r-- 1 root root 0 Nov 21 23:18 abc
-rw-r--r-- 1 root root 0 Nov 21 23:18 abcd
-rw-r--r-- 1 root root 0 Nov 21 23:18 sabc
-rw-r--r-- 1 root root 0 Nov 21 23:20 ssabc

[root@centos2 ~/test]# ll ab*
-rw-r--r-- 1 root root 0 Nov 21 23:18 abc
-rw-r--r-- 1 root root 0 Nov 21 23:18 abcd

[root@centos2 ~/test]# ll ?abc
-rw-r--r-- 1 root root 0 Nov 21 23:18 0abc
-rw-r--r-- 1 root root 0 Nov 21 23:18 sabc

[root@centos2 ~/test]# ll [0-9]*
-rw-r--r-- 1 root root 0 Nov 21 23:18 012
-rw-r--r-- 1 root root 0 Nov 21 23:18 0abc

[root@centos2 ~/test]# ll [^0-9]*
-rw-r--r-- 1 root root 0 Nov 21 23:18 abc
-rw-r--r-- 1 root root 0 Nov 21 23:18 abcd
-rw-r--r-- 1 root root 0 Nov 21 23:18 sabc
-rw-r--r-- 1 root root 0 Nov 21 23:20 ssabc

9. Bash中其他特殊符号

符号 作用
'' 单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义
"" 双引号。在双引号中特殊符号没有特殊含义,但是“$”,“`”和“”例外,拥有“调用变量的值”,“引用命令”和“转义字符”的特殊含义。
`` 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号容易看错
$() 和反引号作用一样,用来引用系统命令
() 用于一串命令执行时,()中的命令会在子shell中运行
{} 用于一串命令执行时,{}中的命令会在当前shell中执行。也可以用于变量变形与替换。
[] 用于变量的测试。
# 在shell脚本中,#开头的行代表注释
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。
转义符,跟在之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当做是变量引用

9.1 单引号和双引号

[root@centos2 ~/test]# name=shw
[root@centos2 ~/test]# echo '$name'
$name
[root@centos2 ~/test]# echo "$name"
shw
[root@centos2 ~/test]# echo `date`
Thu Nov 21 23:38:15 CST 2019
[root@centos2 ~/test]# echo '`date`'
`date`
[root@centos2 ~/test]# echo "`date`"
Thu Nov 21 23:38:30 CST 2019

9.2 反引号

[root@centos2 ~/test]# echo ls
ls
[root@centos2 ~/test]# echo `ls`
012 0abc abc abcd sabc ssabc
[root@centos2 ~/test]# echo $(ls)
012 0abc abc abcd sabc ssabc

9.3 小括号、中括号和大括号

父shell与子shell。在Bash中,可以调用新的Bash。

[root@centos2 ~/test]# pstree
...
        ├─sshd───sshd───bash───pstree
...
[root@centos2 ~/test]# bash
[root@centos2 ~/test]# pstree
...
        ├─sshd───sshd───bash───bash───pstree
...
[root@centos2 ~/test]# exit
[root@centos2 ~/test]# pstree
...
        ├─sshd───sshd───bash───pstree
...
[root@centos2 ~/test]# 

小括号和大括号的区别,如果是用于一串命令的执行,那么小括号和大括号的主要区别在于:

  ()执行一串命令时,需要重新开一个子shell进行执行

  {}执行一串命令时,是在当前shell执行

  ()和{}都是把一串的命令放在括号里面,并且命令之间用;(分号)隔开

  ()最后一个命令可以不用分号

  {}最后一个命令要用分号

  {}的第一个命令和左括号之间必须要有一个空格

  ()里的各种命令不必和括号有空格

  ()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

 例

[root@centos2 ~/test]# name=ss
[root@centos2 ~/test]# (name=ss;echo $name)
ss
[root@centos2 ~/test]# echo $name
ss
[root@centos2 ~/test]# (name=sss;echo $name)
sss
#如果用()括起来一串命令,这些命令都可以执行
#给name变量重新赋值,但是这个值只在子shell中生效
[root@centos2 ~/test]# echo $name
ss
#父shell中的name的值还是ss,而不是sss
[root@centos2 ~/test]# { name=sss;echo $name; }
sss
#用大括号来进行一串命令的执行时,name变量的修改是直接在父shell当中的
#注意大括号的格式
[root@centos2 ~/test]# echo $name
sss
#name的变量已被修改

三、Bash的变量和运算符

1. 什么是变量

在定义变量时,有一些规则需要遵守:

  变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是"2name"则是错误的。

  在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。

  变量用等号连接值,等号左右两侧不能有空格

  变量的值如果有空格,需要使用单引号或双引号包括。如:"test="hello world!""。。其中双引号括起来的内容“$”、“”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符

  在变量的值中,可以使用""转义符

  如果需要增加变量的值,那么可以进行变量值的叠加。不过需要用双引号包含"$变量名"或用${变量名}包含变量名。例

[root@centos2 ~/test]# test=123
[root@centos2 ~/test]# echo $test
123
[root@centos2 ~/test]# test=${test}789
[root@centos2 ~/test]# echo $test
123789
[root@centos2 ~/test]# test="$test"456
[root@centos2 ~/test]# echo $test
123789456

   如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。例

[root@centos2 ~]# test=`date`
[root@centos2 ~]# echo $test
Fri Nov 22 20:38:45 CST 2019

[root@centos2 ~]# now=$(date)
[root@centos2 ~]# echo $now
Fri Nov 22 20:39:16 CST 2019

  环境变量名建议大写,便于区分。

2. 变量的分类

  用户自定义变量:这种变量是最常见的变量,由用户自由定义变量名和变量的值。

  环境变量:这种变量中主要保存的是和系统操作环境相关的数据,比如登录用户,用户的家目录,命令的提示符等。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。

  位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。

  预定义变量:是bash中已经定义好的变量,变量名不能自定义,变量作用固定。

3. 用户自定义变量

3.1 变量定义

[root@centos2 ~]# 1now="hello world"
bash: 1now=hello world: command not found...
#变量名不能数字开头
[root@centos2 ~]# now = "hello world"
date: extra operand ‘=’
Try 'date --help' for more information.
#等号左右不能与空格

[root@centos2 ~]# now=hello world
bash: world: command not found...
#变量的值有空格,必须使用引号包含

3.2 变量的调用

[root@centos2 ~]# now='hello world'
#定义变量now
[root@centos2 ~]# echo $now
hello world
#输出变量now的值

3.3 变量查看

[root@centos2 ~]# set [选项]
选项:
    -u    如果设定此选项,调用未声明变量时会报错(默认无任何提示)
    -x    如果设定此选项,在命令执行之前,会把命令先输出一次
ABRT_DEBUG_LOG=/dev/null
BASH=/bin/bash
...
now='hello world'
test='Fri Nov 22 20:38:45 CST 2019'

#直接使用set命令,会查询系统中所有的变量,包含用户自定义变量和环境变量
[root@centos2 ~]# set -u
[root@centos2 ~]# echo $file
-bash: file: unbound variable
#当设置了-u选项后,如果调用没有设定的变量会报错。默认是没有任何输出的



[root@centos2 ~]# set -x
++ printf '33]0;%s@%s:%s07' root centos2 '~'
[root@centos2 ~]# ls
+ ls --color=auto
anaconda-ks.cfg       login.defs  test.sh  公共  桌面  音乐
hello.sh              nohup.out   top.log  图片  模板
initial-setup-ks.cfg  test        下载     文档  视频
++ printf '33]0;%s@%s:%s07' root centos2 '~'
#如果设定了-x选项,会在每个命令执行之前,先把命令输出一次

3.4 变量删除

[root@centos2 ~]# unset 变量名

4. 环境变量

4.1 环境变量设置

[root@centos2 ~]# export now='2019'
#使用export声明的变量即是环境变量

4.2 环境变量的查询和删除

  env命令和set命令的区别是,set命令可以查看所有变量,而env命令只能查看环境变量。

[root@centos2 ~]# env |grep now
now=2019
[root@centos2 ~]# unset now
[root@centos2 ~]# env |grep now
#删除环境变量now

4.3 系统默认环境变量

[root@centos2 ~]# env
XDG_SESSION_ID=25
HOSTNAME=centos2          #主机名
TERM=xterm            #终端环境
SHELL=/bin/bash         #当前shell
HISTSIZE=1000          #历史命令条数
SSH_CLIENT=192.168.80.1 58994 22    #当前操作环境是ssh连接的,这里记录客户端ip
SSH_TTY=/dev/pts/1            #ssh连接的终端是pts/1
USER=root                  #当前登录的用户
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root    #用户邮箱
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin    #系统查找命令的路径
PWD=/root             #当前所在目录
LANG=en_US.UTF-8         #语系
PS1=[e[35;1m][u@h w]$[e[m] 
HISTCONTROL=ignoredups
SHLVL=1              #当前在第一层shell中
HOME=/root            #当前登录用户的家目录
LOGNAME=root           #登录用户
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
SSH_CONNECTION=192.168.80.1 58994 192.168.80.129 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
DISPLAY=localhost:11.0
_=/usr/bin/env          #上次执行命令的最后一个参数或命令本身
        

   env命令可以查询到所有的环境变量,可是还有一些变量虽然不是环境变量,却是和bash操作接口相关的变量,这些变量也对我们的bash操作终端起到了重要的作用。这些变量就只能用set命令来查看,只列出重要的

[root@centos2 ~]# set | more
BASH=/bin/bash                #Bash的位置
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")    #Bash版本
BASH_VERSION='4.2.46(2)-release'    #bash的版本
HISTFILE=/root/.bash_history        #历史命令保存文件
HISTFILESIZE=1000            #在文件中记录历史命令的最大条数
HISTSIZE=1000              #在缓存中记录历史命令的最大条数
LANG=en_US.UTF-8            #语系环境
MACHTYPE=x86_64-redhat-linux-gnu  #软件类型是x86_64
MAILCHECK=60              #每60秒去扫描新邮件
PPID=4606                #父shell的PID。
PS1='[e[35;1m][u@h w]$[e[m] '    #命令提示符
PS2='> '                       #如果命令一行没有输入完成,第二行命令的提示符
UID=0                   #当前用户的UID

  PATH变量:系统查找命令的路径

  先查询下PATH环境变量的值

[root@centos2 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

    PATH变量的值是用":"分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个程序名,如果没有写入路径,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报"命令未找到"的错误。

  把我们自己的脚本拷贝到PATH变量定义的路径中,我们自己写的脚本不输入路径就可直接运行。

[root@centos2 ~]# vim test.sh
[root@centos2 ~]# cp test.sh /usr/local/bin
[root@centos2 ~]# test.sh
hello world

  通过修改PATH变量的值,也可以。(常用)

  想要永久生效,需要写入环境变量配置文件。

  PS1变量:命令提示符设置

PS1是用来定义命令行的提示符的。可以按照我们自己的需求来定义自己喜欢的提示符。支持一下选项

d    显示日期,格式为“星期 月 日”
H    显示完整的主机名。
h    显示简写主机名
	    显示24小时制时间,格式为“HH:MM:SS”
T    显示12小时制时间,格式为“HH:MM:SS”
A    显示24小时制时间,格式“HH:MM”
@    显示12小时制时间,格式“HH:MM am/pm”
u    显示当前用户名
v    显示Bash的版本信息
w    显示当前所在目录的完整名称
W    显示当前所在目录的最后一个目录
#    执行的第几个命令
$    提示符。root为'#',普通用户为'$'
[root@centos2 ~]# echo $PS1
[e[35;1m][u@h w]$[e[m]

  在PS1变量中,如果是可以解释的符号,如"u"、"h"等,则显示这个符号的作用。如果是不能解释的符号,如"@"、"空格",则原符号输出。

  LANG语系变量

LANG变量定义了linux系统的主语系环境,默认值是

[root@centos2 ~]# echo $LANG
en_US.UTF-8

linux支持的语系

[root@centos2 ~]# locale -a |more
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER@saaho
aa_ER.utf8
aa_ER.utf8@saaho
aa_ET
aa_ET.utf8
...

[root@centos2 ~]# locale -a |wc -l
791
#总数

  当前系统的语系

[root@centos2 ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

  通过/etc/locale.conf定义系统的默认语系。

[root@centos2 /etc]# cat locale.conf 
LANG=en_US.UTF-8

  默认语系是下次重启之后系统所使用的语系,当前系统语系是当前系统使用的语系。如果系统重启,会从默认语系配置文件/etc/locale.conf文件中读取语系,然后赋予变量LANG让这个语系生效。也就是说,LANG定义的语系只对当前系统生效,要想永久生效就要修改/etc/locale.conf文件。

5. 位置参数变量

位置参数变量 作用
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数
root@centos2 ~]# vim sum.sh 
#!/bin/bash

num1=$1
#给num1变量赋值是第一个参数
num2=$2
#给num2变量赋值是第二个参数
sum=$[ $num1+$num2 ]
#变量sum的值时num1加num2
echo $sum
#打印变量sum的值
[root@centos2 ~/sh]# vim paramenter.sh

#!/bin/bash

echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The paramenters is: $*"
#使用$*代表所有的参数
echo "The paramenters is: $@"
#使用$@也代表所有的参数

  $*会把接收的所有参数当做一个整体对待,而$@则会区分对待接收到的所有参数。

[root@centos2 ~/sh]# vim paramenter2.sh 

#!/bin/bash


for i in "$*"
        do
                echo "The paramenters is: $i"
        done

x=1
for y in "$@"
        do
                echo "The paraments$x is: $y"
                x=$(( $x+1 ))
        done
~                                       
[root@centos2 ~/sh]# chmod +x paramenter2.sh 
[root@centos2 ~/sh]# bash paramenter2.sh 1 2 3 4
The paramenters is: 1 2 3 4
The paraments1 is: 1
The paraments2 is: 2
The paraments3 is: 3
The paraments4 is: 4

6. 预定义变量

预定义变量 作用
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一命令正确执行;如果这个变量的返回值非0(具体是哪个数,有命令自己决定),则证明上一个命令执行出错
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
[root@centos2 ~/sh]# ll
total 20
-rwxr-xr-x 1 root root  35 Nov 20 17:56 hello.sh
-rwxr-xr-x 1 root root 147 Nov 22 22:32 paramenter2.sh
-rwxr-xr-x 1 root root 207 Nov 22 22:26 paramenter.sh
-rwxr-xr-x 1 root root  61 Nov 22 22:20 sum.sh
-rwxr-xr-x 1 root root  40 Nov 22 21:43 test.sh
[root@centos2 ~/sh]# echo $?
0
#命令正确执行
[root@centos2 ~/sh]# llll
bash: llll: command not found...
[root@centos2 ~/sh]# echo $?
127
#命令执行出错
[root@centos2 ~/sh]# vim variable.sh

#!/bin/bash

echo "The current process is $$"
#输出当前进程的PID
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID

find /root -name hello.sh &
#使用find命令在/root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行
echo "The last one Daemon process is $!"
#输出这个后台执行的进程的PID,也就是find命令的PID
[root@centos2 ~/sh]# chmod +x variable.sh 
[root@centos2 ~/sh]# bash variable.sh 
The current process is 5952
The last one Daemon process is 5953

7. 接收键盘输入

[root@centos2 ~/sh]# read [选项] [变量名]
选项
    -p “提示信息”            在等待read输入时,输出提示信息
    -t 秒数                    read命令会一直等待用户输入,使用此选项可以指定等待时间
    -n 字符数                read命令只接收指定的字符数,就会执行
    -s                            隐藏输入的数据,适用于机密信息的输入
变量名
    变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY
    如果只提供了一个变量名,则整个输入行赋予该变量
    如果提供了一个以上的变量名,则输入行分为若干字,一个接一个的赋予各个变量,而命令行的最后一个变量取得剩余的所有字

 例

[root@centos2 ~/sh]# vim read.sh

#!/bin/bash
#by author nanshan

read -t 30 -p "please input your name:" name
#提示"请输入姓名"并等待30s,把用户的输入保存到变量name中
echo "name is $name"
#查看变量name中是否保存了输入
read -s -t 30 -p "please enter your age:" age
#提示"请输入你的年龄"并等待30s,把用户的输入保存到变量age中
#年龄是隐私,使用"-s"选项隐藏输入
echo -e "
"

echo "age is $age"

read -n 1 -t 30 -p "please select you gender[M/F]: " gender
#提示"请选择性别"并等待30s,把用户的数仍然保存到变量gender
#使用"-n 1"选项只接收一个输入字符就会执行(不用输入回车)
echo -e "
"

echo "sex is $gender"

8. shell的运算符

8.1 数值运算的方法

如果需要进行数值运算,可以采用以下三种方法中的任意一种

8.1.1 使用declare声明变量类型

  所有的变量类型默认都是字符串型,只要我们把变量声明为整数型就可以运算了,使用declare命令就可以实现声明变量的类型。

[root@centos2 ~/sh]# declare [+/-][选项] 变量名
选项
    -:    给变量设定类型属性
    +:    取消变量的类型属性
    -a:    将变量声明为数组型
    -i:    将变量声明为整数型(integer)
    -r:    将变量声明为只读。注:一旦设置为只读变量,就既不能修改变量的值,也不能删除变量,甚至不能通过+r取消只读属性
    -x:    将变量声明为环境变量
    -p:    显示指定变量的被声明的类型

例1:数值运算

[root@centos2 ~/sh]# a=11
[root@centos2 ~/sh]# b=22
#赋值
[root@centos2 ~/sh]# declare -i c=$a+$b
#声明变量c的类型为整数型,它的值是a和b的和
[root@centos2 ~/sh]# echo $c
33

例2:数组变量类型

  所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分它们的变量的集合,这个名字称作数组名,编号称为下标。组成数组的各个变量称为数据的分量,也称为数据的元素,或下标变量。

  变量和数组都是用来保存数据的,只是变量只能赋予一个数据值,一旦重复复制,后一个值就会覆盖上一个值。而数组是可以赋予一组相同类型的数据值。大家可以把变量想象成一个小办公室,这个办公室只能容纳一个人办公,办公室名就是变量名。而数组是一个大办公室,可以容纳很多人同时办公,在这个大办公室办公的每个人是通过不同的座位号来区分的,这个座位号就是数组的下标,而大办公室的名字就是数组名。

[root@centos2 ~/sh]# name[0]=ss
#数组中第一个变量为ss
[root@centos2 ~/sh]# name[1]=sss
[root@centos2 ~/sh]# name[2]=ssss

[root@centos2 ~/sh]# echo ${name}
ss
#输出数组的内容,如果只写数组名,就只输出第一个下标变量
[root@centos2 ~/sh]# echo ${name[*]}
ss sss ssss
#输出数组的所有内容
[root@centos2 ~/sh]# echo ${name[2]}
ssss

  数组的下边是从0开始的,在调用数组时,需要使用${数组[下标]}的方式读取。

例3:环境变量

  使用declare命令把变量声明为环境变量,和export的作用一样

[root@centos2 ~/sh]# declare -x ceshi=sss
#将变量ceshi声明为环境变量
[root@centos2 ~/sh]# env |grep ceshi
ceshi=sss

例4:只读属性

  一旦给变量设定了只读属性,那这个变量就不能修改变量的值,也不能删除变量,甚至不能使用"+r"选项取消只读属性。

[root@centos2 ~/sh]# declare -r ceshi
#赋予ceshi只读属性
[root@centos2 ~/sh]# ceshi=123
-bash: ceshi: readonly variable
#变量值不能修改
[root@centos2 ~/sh]# declare +r ceshi
-bash: declare: ceshi: readonly variable
#不能取消只读属性
[root@centos2 ~/sh]# unset ceshi
-bash: unset: ceshi: cannot unset: readonly variable
#不能删除变量

  这个变量只是命令行声明,为临时,只要重新登录或重启,该变量就会消失。

例5:查询变量属性和取消变量属性

  变量属性的查询使用"-p"选项,变量属性的取消使用"+"选项

[root@centos2 ~/sh]# declare -p c
declare -i c="33"
#c变量是int型
[root@centos2 ~/sh]# declare -p ceshi
declare -rx ceshi="sss"
#ceshi变量是环境变量和只读变量
[root@centos2 ~/sh]# declare -p name
declare -a name='([0]="ss" [1]="sss" [2]="ssss")'
#name变量是数组型

[root@centos2 ~/sh]# declare +x ceshi
#取消ceshi变量的环境变量
[root@centos2 ~/sh]# declare -p ceshi
declare -r ceshi="sss"
#只读属性取消不了

8.1.2 使用expr或let数值运算工具

  进行数值运算的第二种方法是使用expr命令。

[root@centos2 ~/sh]# a=1
[root@centos2 ~/sh]# b=2
#给变量赋值
[root@centos2 ~/sh]# c=$(expr $a + $b)
#c的值是a和b的和。注:"+"号左右两侧必须有空格
[root@centos2 ~/sh]# echo $c
3

  使用expr命令运算时,"+"号左右必须有空格,否则运算不执行。

  let命令和expr命令类似。

[root@centos2 ~/sh]# d=11
[root@centos2 ~/sh]# e=22
#给变量赋值
[root@centos2 ~/sh]# let f=$d+$e
[root@centos2 ~/sh]# echo $f
33
#变量f的值是d和e的和

[root@centos2 ~/sh]# n=20
[root@centos2 ~/sh]# let n+=1
#变量n的值等于变量本身再加1
[root@centos2 ~/sh]# echo $n
21

8.1.3 使用"$((运算式))"或"$[运算式]"方式运算

[root@centos2 ~/sh]# aa=11
[root@centos2 ~/sh]# bb=22
[root@centos2 ~/sh]# cc=$(( $aa+$bb))
[root@centos2 ~/sh]# echo $cc
33
[root@centos2 ~/sh]# dd=$[$aa+$bb]
[root@centos2 ~/sh]# echo $dd
33

  三种方式,选择合适自己的使用,推荐"$(())"

8.2 shell常用运算符

优先级 运算符 说明
13 -,+ 单目负,单目正
12 !,~ 逻辑非、按位取反或补码
11 *,/,% 乘,除,取模
10 +,- 加,减
9 <<,>> 按位左移、按位右移
8 <=,>=,<,> 小于等于、大于等于、小于、大于
7 ==,!= 等于、不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑非
1 =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= 赋值、预算且赋值

  运算符优先级表明在每个表达式或子表达式中哪一个预算对象首先被求值,数值越大优先级越高,具有较高优先级的运算符先于较低级别的运算符进行求职运算。

例1:加减乘除

[root@centos2 ~/sh]# aa=$(( (11+3)*2/4))
#可以通过小括号调整运算优先级
[root@centos2 ~/sh]# echo $aa
7

例2:取模运算

[root@centos2 ~/sh]# bb=$(( 15%2 ))
[root@centos2 ~/sh]# echo $bb
1

#余数是1

例3:逻辑与/逻辑非

[root@centos2 ~/sh]# cc=$(( 1 && 0))
[root@centos2 ~/sh]# echo $cc
0

[root@centos2 ~/sh]# cc=$(( 1 || 0)) [root@centos2 ~/sh]# echo $cc 1

9. 变量测试与内容置换

变量置换方式 变量y没有声明 变量y为空值 变量y有值
x=${y-新值} x=新值 x为空 x=$y
x=${y:-新值} x=新值 x=新值 x=$y
x=${y+新值} x为空 x=新值 x=新值
x=${y:-新值} x为空 x为空 x=新值
x=${y=新值} x=新值  y=新值 x为空  y值不变 x=$y  y值不变
x=${y:-新值} x=新值  y=新值 x=新值  y=新值 x=$y  y值不变
x=${y?新值} 新值输出到标准错误输出(屏幕) x为空 x=$y
x=${y:?新值} 新值输出到标准错误输出 新值输出到标准错误输出 x=$y

  

  如果大括号内没有“:”,则变量y是为空,还是没有设置,处理方法是不同的;如果大括号内有“:”,则变量y不论是为空,还是没有没有设置,处理方法是一样的

  如果大括号内是“-”或“+”,则在改变变量x值的时候,变量y是不改变的;如果大括号内是“=”,则在改变变量x值的同时,变量y的值也会改变。

  如果大括号内是“?”,则当变量y不存在或为空时,会把“新值”当成报错输出到屏幕上

  常用第一种。

[root@centos2 ~/sh]# echo $y

[root@centos2 ~/sh]# x=${y-new}
[root@centos2 ~/sh]# echo $x
new
[root@centos2 ~/sh]# echo $y


[root@centos2 ~/sh]# y=""
[root@centos2 ~/sh]# x=${y-new}
[root@centos2 ~/sh]# echo $x

[root@centos2 ~/sh]# echo $y

#变量x和变量y值都是空
[root@centos2 ~/sh]# y="1"
[root@centos2 ~/sh]# x=${y-new}
[root@centos2 ~/sh]# echo $x
1
[root@centos2 ~/sh]# echo $y
1
#变量x和变量y的值都是1

四、环境变量配置文件

1. source命令

[root@centos2 ~]# source 配置文件
或
[root@centos2 ~]# . 配置文件

2. 环境变量配置文件

2.1 登录时生效的环境变量配置文件

Linux系统登录时主要生效的环境变量配置文件有五个:

/etc/profile

/etc/peofile.d/*.sh

~/.bash_profile

~/.bashrc

/etc/bashrc

环境变量配置文件调用过程

2.1.1 在用户登录过程中先调用/etc/profile文件

在这个环境变量配置文件中会定义下述默认环境变量:

  USER:根据登录的用户,给这个变量赋值(就是让USER变量的值是当前用户)

  LOGNAME:根据USER的值,给这个变量赋值

  MAIL:根据登录的用户,定义用户的邮箱为/var/spool/mail/用户名

  PATH:根据登录用户的UID是否为0,判断PATH变量是否包含/sbin、/bin/sbin 和/usr/local/sbin这三个系统命令目录

  HOSTNAME:根据主机名,给这个变量赋值

  HISTSIZE:定义历史命令的保存条数

  umask:定义umask默认权限。注意/etc/profile文件中的umask权限是在"有用户登录过程(输入了用户名和密码)"时才会生效。

  调用/etc/profile.d/*.sh文件,调用/etc/profile.d/目录下所有以.sh结尾的文件

2.1.2 由/etc/profile文件调用/etc/profile.d/*.sh文件

  这个目录中所有以.sh结尾的文件都会被/etc/profile文件调用,这里最常用的就是lang.sh文件,而这个文件又会调用/etc/sysconfig/i18n文件。

2.1.3 由/etc/profile文件调用~/.bash_profile文件

~/.bash_profile文件主要实现两个功能

  调用~/.bashrc文件

  在PATH变量后面加入了":$HOME/bin"这个目录。也就是说,如果我们在自己的家目录中建立bin目录,然后把自己的脚本放入"~/bin"目录下,就可直接执行脚本,而不用通过目录执行。

2.1.4 有~/.bash_profile文件调用~/.bashrc文件

在~/.bashrc文件中主要实现:

  定义默认别名

  调用/etc/bashrc

2.1.5 由~/.bashrc文件调用/etc/bashrc文件

在/etc/bashrc文件中主要定义了以下内容:

  PS1:用户的提示符

  umask:定义umask默认权限。这个文件中定义的umask是针对“没有登录过程(也就是不需要输入用户名和密码时,比如从一个终端切换到另一个终端,或进入子Shell)”时生效的。如果是“有用户登录过程”,则是/etc/profile文件中的umask生效。

  PATH:会给PATH变量追加值,当然也是在“没有登录过程”时才生效

  调用/etc/profile.d/*.sh文件,这也是在“没有用户登录过程”是才调用。在“有用户登录过程”时,/etc/profile.d/*.sh文件已经被/etc/profile文件调用过了。

  这样这五个环境变量配置文件会被依次调用,那么如果是我们自己定义的环境变量应该放入哪个文件呢?如果你的修改是打算对所有用户生效的,那么可以放入/etc/profile环境变量配置文件;如果你的修改只是给自己使用的,那么可以放入~/.bash_profile或~/.bashrc这两个配置文件中的任一个。

  可是如果我们误删除了这些环境变量,比如删除了/etc/bashrc文件,或删除了~/.bashrc文件,那么这些文件中配置就会失效(~/.bashrc文件会调用/etc/bashrc文件)。那么我们的提示符就会变成:

-bash-4.1#

2.2 注销时生效的环境变量配置文件

  在用户退出登录时,只会调用一个环境变量配置文件,就是~/.bash_logout。这个文件默认没有写入任何内容,如果想要在退出登录时执行一些操作,比如清除历史命令,备份某些数据,就可以把命令写入这个文件。

2.3 其他配置文件

  还有一些环节变量配置文件,最常见的就是~/bash_history文件,也就是历史命令保存文件。

3. shell登录信息

3.1 /etc/issue

  在登录tty1-tty6这六个本地终端时,会有几行的欢迎界面。这些欢迎信息是保存在/etc/issue文件中

[root@centos2 ~]# cat /etc/issue
S
Kernel 
 on an m

   可以支持的转义符可以通过man agetty命令查询,在表中列出常见的转义符作用

转义符 作用
d 显示当前系统日期
s 显示操作系统名称
l 显示登录的终端号,常用
m 显示硬件体系结构,如i386、i686等
显示主机名
o 显示域名
显示内核版本
显示当前系统时间
u 显示当前登录用户的序列号

3.2 /etc/issue.net

  /etc/issue是在本地终端登录时显示欢迎信息的,如果是远程登录(如ssh远程登录,或telnet远程登录)需要显示欢迎信息,则需要配置/etc/issue.net这个文件。注意:

    在/etc/issue文件中支持的转义符,在/etc/issue.net文件中不能使用

    ssh远程登录是否显示/etc/issue.net文件中的欢迎信息,是由ssh的配置文件决定的

  如果需要ssh远程登录可以查看/etc/issue.net的欢迎信息,首先需要修改ssh的配置文件/etc/ssh/sshd_config,加入下述内容:

[root@centos2 ~]# vim /etc/ssh/sshd_config 

Banner /etc/issue.net

  这样在ssh远程登录时,也可以显示欢迎信息,只是不再可以识别“d”和“l”等信息了

 3.3 /etc/motd

  /etc/motd文件中也是显示欢迎信息的,这个文件和/etc/issue及/etc/issue.net文件的区别是:/etc/issue/etc/issue.net是在用户登录之前显示欢迎信息,而/etc/motd是在用户输入用户名和密码,正确登录之后显示欢迎信息。在/etc/motd文件中的欢迎信息,不论是本地登录,还是远程登录都可以显示。

4. 定义快捷键

[root@centos2 ~]# stty -a
#查询所有的快捷键

这些快捷键可以修改

[root@centos2 ~]# stty 关键字 快捷键
原文地址:https://www.cnblogs.com/sswind/p/11888472.html