03从变量PS1到centos7配置文件到变量。转义字符介绍
内容介绍:
由于使用centos7,使用命令时,常常不知道命令提示符在哪一行,如果设置了颜色后,可以快速找到命令提示符所在行。而命令提示符发现可以通过变量PS1修改颜色,而临时设置了PS1变量后,一旦退出伪终端xshell后,再次登录后,发现变量PS1的值又变回原来的值。由此涉及的centos配置文件与变量种类也了解了一下。最后命令提示符的颜色总算是再次登录或重启虚拟机也可以生效了。
1、 命令提示符颜色变量PS1
查看变量PS1的内容如下图
此处解释如下表格,下面4个都可以成功设置红色
PS1="\[\e[1;31;40m[\aaa@qq.com\h:\w ]\\$ \e[0m\]" 设置好后,用上下键查找历史命令时,命令提示符消失,命令提示符后输入字符,再按退格键,命令提示符也会被删除 |
PS1="\[\e[1;31;40m[\aaa@qq.com\h:\w ]\\$ \[\e[0m" 同上 |
PS1="\e[1;31;40m[\aaa@qq.com\h:\w ]\\$ \e[0m" 此处不会出现上述情况,但在xshell中粘贴命令执行时,会出现错位情况
|
PS1="\[\e[1;31;40m\][\aaa@qq.com\h:\w ]\\$ \[\e[0m\]" 此处不会出现上述3种情况 。成对出现规则如此处的变量PS1 |
[aaa@qq.com ~ ]#cat /etc/profile.d/env.sh
PS1="\[\e[34m\][\aaa@qq.com\h \W ]\\$\[\e[0m\]
\[ | \e[1;31;40m 或者\e可以用\033替代(0表示八进制) |
[\aaa@qq.com\h:\w]\$ | \e[0m | \] |
表示转义字符,启用解释功能 | m后面是要设置颜色的字体;31到37表示字体颜色;40到47表示背景颜色。总共三个参数,以“;”分隔。无顺序之分 | 字体 | 颜色结束 | 解释功能结束符号 |
[aaa@qq.com:~ ]# echo -e "\e[36m确认过眼神,不会错的\e[0m你开心就好"
确认过眼神,不会错的你开心就好
[aaa@qq.com:~ ]#
echo 中的选项-e 表示启用解释功能,即\e代表特殊功能,不是字符\e
-----------------------------------详细解释请看下文---------------------------------------------------------------------------
利用set和grep匹配出PS1为本地变量
PS1=’[\aaa@qq.com\h \W]\$’ ,各个字段的意思如下表格
• \e等同于八进制 \033 | • \u当前用户 |
• \h 当前主机名 | • \H 主机名 |
• \w 当前工作目录 | • \W 当前工作目录基名 |
• \t 24小时时间格式 | • \T 12小时时间格式 |
• \! 命令历史数 | • \# 开始后命令历史数 |
本处使用shell类型默认为bash,
在命令行输入:PS1="\[\e[1;31;40m\][\[\e[0;32;40m\]\aaa@qq.com\h:\[\e[1;35;40m\]\w\[\e[1;31;40m\]]\[\e[1;31;40m\]\\$\[\e[1;32;40m\]"
如下图:
上述命令提示符颜色即可改变,但退回xshell再次登录,颜色就不生效了。
解决方法如下:
在全局配置文件/etc/profile.d/env.sh中(.sh的前缀可以随意设置),编辑:永久生效
PS1="\e[1;31;40m[\e[0;32;40m\aaa@qq.com\h:\e[1;35;40m\w\e[1;31;40m]\e[1;31;40m\\$\e[1;32;40m"图中为root用户,应为#,\\$已经标红
其中\e[1;31;40m表示后面字符的颜色
如上图中的命令提示符的颜色
\[ | \[ 表示转义字符开始中括号 |
\] | \] 表示转义字符结束中括号 |
\e[1;31;40m[ |
表示左[的颜色 |
\e[0;32;40m\aaa@qq.com\h: |
表示\aaa@qq.com\h:的颜色 |
\e[1;35;40m\w |
表示\w的颜色 |
\e[1;31;40m] |
表示右]的颜色 |
\e[1;31;40m\\$ |
表示\$的颜色 转义字符\\$ 本文最底下 |
\e[1;32;40m |
表示命令提示符后面输入命令的颜色 |
上述颜色用来表示[\aaa@qq.com\h\w ] \$ 颜色:如[aaa@qq.com : ~]#
----------------------------------------------------------------------------------------
具体\e[1;31;40m含义如下:
\e表示颜色起始部分,也可以用\033代替
[左括号后面跟颜色设置,不能颜色功能用英文分号(;)分隔
- 1 表示字体加粗,且有字体高亮功能,如上图中左括号的高亮红色。 0表示默认字体。4表示给字体加上下划线。5表示字体闪烁。7表示用亮色突出显示,来让你的文字更加醒目
- 31表示字符颜色。
可选颜色:红色、绿色、黄色、蓝色、洋红、青色和白色。他们对应的颜色代码是:30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)
- 40表示字符背景色。可选颜色 40、41、42、43、44、45、46、47
- m表示后面是要设置颜色的字体
**************************************************************************************************
上述提到的全局配置文件/etc/profile.d/env.sh。如下介绍:
2、 centos7中bash的配置文件
- 按生效范围划分,存在两类:
• 全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
• 个人配置:
~/.bash_profile
~/.bashrc
I. 编辑配置文件生效
• 修改profile和bashrc文件后需生效两种方法:
1重新启动shell进程
2 . 或source
例:
. ~/.bashrc
.
I. 重启后shell的登录方式
• 交互式登录:
(1)直接通过终端输入账号密码登录(登录图形化界面,登录tty,ssh,telnet)
(2)使用“su - UserName” 切换的用户
执行顺序:/etc/profile (登录默认触发,引用下一个配置文件)--> /etc/profile.d/*.sh --> ~/.bash_profile (登录默认读取,引用下一个配置文件)-->~/.bashrc--> /etc/bashrc
• 非交互式登录:
(1) su UserName
(2)图形界面下打开的终端
(3)执行脚本 脚本是在子shell运行的
(4)任何其它的bash实例
执行顺序: ~/.bashrc --> /etc/bashrc--> /etc/profile.d/*.sh
1. Profile类
• 按功能划分,存在两类:
profile类和bashrc类
• profile类:为交互式登录的shell提供配置
全局:/etc/profile,/etc/profile.d/*.sh
个人:~/.bash_profile
功用:
(1) 用于定义环境变量
(2) 运行命令或脚本
2. Bashrc类
• bashrc类:为非交互式和交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量
3、 变量简单介绍
变量:命名的内存空间
数据存储方式:
字符:
数值:整型,浮点型
变量:变量类型
作用:
1、数据存储格式
2、参与的运算
3、表示的数据范围
类型:
字符
数值:整型、浮点型
变量
• 强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时 必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误
如 java,c#
• 弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动 进行隐式类型转换;变量无须事先定义可直接调用
如:bash 不支持浮点数,php
• 变量命名法则:
1、不能使程序中的保留字:例如if, for
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法
bash中变量的种类
• 根据变量的生效范围等标准划分下面变量类型:
局部变量:生效范围为当前shell进程;对当前shell之外的其它shell 进程,包括当前shell的子shell进程均无效
环境(全局)变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
位置变量:$1, $2,...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:$?, $0, $*, aaa@qq.com, $#,$$
脚本在/app/下
[aaa@qq.com app ]#vim test1.sh
#!/bin/bash
echo '$1' is :$1
echo '$2' is :$2
echo '$3' is :$3
echo '$4' is :$4
#显示命令本身
echo '$0' is :$0
# 显示所有参数
echo '$*' is :$*
#显示所有参数(每个参数是独立的,如果在当前shell里面引用第二个sh脚本,并显示aaa@qq.com,则显示第一个独立参数)
echo 'aaa@qq.com' is :aaa@qq.com
#参数个数
echo '$#' is :$#
[aaa@qq.com app ]# chmod +x 1.sh
[aaa@qq.com app ]# test1.sh {0..9}
-------------------------------------------------
说明aaa@qq.com与$*的区别
[aaa@qq.com app ]#vim a.sh
#!/bin/bash
echo a.sh:all arg are "$*"
/app/b.sh "aaa@qq.com"
[aaa@qq.com app ]#vimb.sh
#!/bin/bash
echo b.sh 1st arg is $1
[aaa@qq.com app ]#chmod+x a.sh b.sh ;./a.sh a b c
sh:all arg are a b c
a
把aaa@qq.com换成$*后为:
[aaa@qq.com app ]#chmod+x a.sh b.sh ;./a.sh a b c
sh:all arg are a b c
a b c
变量要规范
本地变量:父进程和子进程中的变量,只能对当前的进程有效;
环境变量的声明:为了让子进程继承父进程的变量。定义环境变量1、export var1 ;2、declare -x var1 ;继承是往下继承的:即子进程继承父进程的,而不能反过来
set可以看到所有的变量 ,env只看到环境变量,export ,declare -x
局部变量
变量赋值:name=‘value’
• 可以使用引用value:
(1) 可以是直接字串;name=“root"
(2) 变量引用:name="$USER"
(3) 命令引用:name=`COMMAND` name=$(COMMAND)
• 变量引用:${name} $name
"":弱引用,其中的变量引用会被替换为变量值
'':强引用,其中的变量引用不会被替换为变量值,而保持原字符串
• 显示已定义的所有变量:set
• 删除变量:unsetname
环境变量
变量声明、赋值:
export name=VALUE
declare -x name=VALUE
• 变量引用:$name,${name}
• 显示所有环境变量:
env
printenv
export
declare -x
• 删除变量:
unset name
bash内建的环境变量:
– PATH
– SHELL
– USER
– UID
– HOME
– PWD
– SHLVL
– LANG
– HOSTNAME
– HISTSIZE
– —
只读和位置变量
- 只读变量:只能声明,但不能修改和删除
声明只读变量:
readonly name
declare-r name
:type declare 只读变量在当前shell退出时自动消失,只读变量在声明为环境变量时(export name),再打开一个子shell(bash),父shell只读变量在子shell会失去只读属性
查看只读变量: readonly –p
- 位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ...:对应第1、第2等参数,shift [n]换位置
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
aaa@qq.com: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
aaa@qq.com $* 只在被双引号包起来的时候才会有差异set -- 清空所有位置变量
---------------------------------------------
Test.sh #!/bin/bash
echo $1
Shift
Echo $1
[aaa@qq.com:~]#chmod +x Test.sh
./test.sh a b c
a
b
----------------------------------------
----------------------------------------
readonly p1=3.14 declare -r ;readonly -p ;
name=test;(echo $name;name=222;echo $name);echo $name
上述结果为:
test
222
test
解释:小括号在name=222处开启了一个子进程,命令结束后又回到父进程
-----------------------------------------------------需求,用umask创建一个600权限的文件,并且不影响当前的umask值
(umask 066;touch /app/f1)
(name=haha;touch/app/$name.log)
(ls:pwd)> /app/all.log 前面讲到的所谓命令行扩展()及``
-----------------------------------------------------------如果按照变量永久生效和临时生效来说,可以定义一个变量生存周期,而生存周期:永久生效则需要修改配置文件,同时注意用户对象及登录方式;临时生效则定义一个变量即可,需要注意变量生效范围
4、转义字符
1、反斜线(\)会使随后的字符按原意解释
$ echo Yourcost: \$5.00
Your cost: $5.00
2、 单引号(’’):转义其中所有的变量为字符串
3、 加引号来防止扩展 (保留其中的变量属性,不进行转义)
– 单引号(’)防止所有扩展,即’ ’单引号里面的字符就代表字符本意
– 双引号(”)也防止所有扩展,但是以下情况例外:
$(美元符号) - 变量扩展 双引号里面的$不代表字符本意,表示其后面是一个变量
`(反引号) - 命令替换 ,反引号里面有特殊含义的按照特殊含义解释。如cd是切换目录
\(反斜线) - 禁止单个字符扩展,\$ 表示$字符,不代表变量
!(叹号) - 历史命令替换
4、反引号(``):把其中的命令执行后返回结果
命令行扩展:反引号(``)或者$()