shell补-变量-变量
变量的本质
shell补-变量常见的环境变量
环境变量 | 含义 | 备注 |
---|---|---|
LANG language | 记录系统字符集 语言 zh_CN.UTF-8 en_US.UTF-8 | localectl(centos7)修改文件/etc/sysconfig/i18n(centos6.x) |
PS1 | 命令行格式 | |
PATH | 命令路径 执行命令,系统会在PATH路径中查证 |
存放的哪些命令文件的路径在哪儿 |
UID | 记录用户的UID信息 | 脚本中判断用户是否是root |
HOSTNAME | 主机名 | |
历史命令相关 | HIST history | |
HISTSIZE | history命令记录条数最多 | history -c/-w/-a/-d |
HISTFILESIZE | history 文件记录的最多条数 | 指定历史记录文件的位置 |
HISTFILE | 指定历史记录文件的位置 | 文件默认在用户当前家目录~/.bash_history |
TMOUT | 不进行操作 自动断开时间 | |
HISTCONTROL | 控制history命令是否记录以空格开头的命令 | export HISTCONTROL=Ignorespace 以空格开头的命令不会被记录到history中 |
PROMPT_COMMAND | 存放的命令/脚本会在下1个命令执行前运行 | 可记录用户操作 |
历史记录文件说不定能查到修改的密码 ,比如修改的命令记录到历史文件
如果用到 HISTCONTROL 让空格开头的命令不如历史记录,只需要在命令前面加上空格
##测试一个有意思的环境变量
[root@localhost ~]# export PROMPT_COMMAND=date
2023年 10月 11日 星期三 15:45:25 CST
[root@localhost ~]# echo hello
hello
2023年 10月 11日 星期三 15:45:31 CST
[root@localhost ~]#
shell补-变量与变量相关的文件
每次登录系统,切换用户会读取的文件
文件名 | 作用 | 备注理解 |
---|---|---|
/etc/profile | 存放环境变量 和别名 | 全局生效 |
/etc/bashrc | 别名 | 全局生效 |
~/.bashrc | 当前用户的别名 | 局部生效 |
~/.bash_profile | 当前用户的环境变量 | 局部生效 |
/etc/profile.d/xxxx.sh | 用户登录后执行这个目录下,以.sh结尾的脚本 | 应用场景:自己书写个跳板机, 跳板机脚本可以放在这里 |
/etc/profile.d/目录下的一定要用.sh结尾;在我们做些需求有用户执行命令,行为审计,跳板机这类的时候可以使用,因为这些脚本用户不想执行,就可以放这目录
,
总结:找shell编程火三剑客题目刷个100多就差不多了
shell补-变量特殊变量
位置变量
$0 :脚本名字 一般应用在,如果脚本执行错误,给出错误提示或使用帮助
[root@localhost hello]# cat testvar.sh
#!/bin/bash
[ "$#" -ne "1" ] && echo "$0 :需要只能录入一个参数" || echo "欢迎登陆,${1}"
[root@localhost hello]# sh testvar.sh mrxu
欢迎登陆,mrxu
[root@localhost hello]# sh testvar.sh mrxu root
testvar.sh :需要只能录入一个参数 ####有帮助提示的作用
[root@localhost hello]#
可以通过man bash 搜Special Parameters
表示状态的特殊变量
$?:针对命令行执行结果,注意可能有些命令可能执行成功了,但是结果不是 0
$$:当前进程号;或生成PID文件;服务管理脚本时使用
###一个窗口开启进程等待
[root@localhost sub_str]# sh testprc.sh
当前进程号 4257
^C
[root@localhost sub_str]# cat testprc.sh
#!/bin/bash
echo "当前进程号 "$$
sleep 999
[root@localhost sub_str]#
###另一个窗口查看
[root@localhost ~]# ps -ef|grep testyy.sh
root 4284 3792 0 11:01 pts/1 00:00:00 grep --color=auto testyy.sh
[root@localhost ~]#
####################&后台执行
[root@localhost sub_str]# sh testprc.sh &
[1] 4547
当前进程号 4547
[root@localhost sub_str]# ps -ef|grep testprc.sh
root 4547 2904 0 11:13 pts/0 00:00:00 sh testprc.sh
root 4559 2904 0 11:13 pts/0 00:00:00 grep --color=auto testprc.sh
[root@localhost sub_str]#
应用案例,脚本运行的时候生成pid文件,方便以后kill
大部分运行起来的服务都有自己的pid文件,主要保管pid
pid文件一般都是用$$来写,一般i而在/var/run/下面
& 程序或者脚本进入后台运行
[root@localhost sub_str]# cat /var/run/crond.pid
1221
[root@localhost sub_str]# kill `cat /var/run/crond.pid` 相当于
stop
[root@localhost sub_str]# systemctl stop crond
shell补-变量shell子串
跟子串用法有相似的
tr命令,替换命令
cut 命令 -c 截取命令
##截取
[root@localhost ~]# echo $name
徐先生管理员
[root@localhost ~]# echo $name|cut -c 2-3 ###截取2-3位
先生
###替换
[root@localhost ~]# echo "hello,word" |tr "," "_"
hello_word
[root@localhost ~]#
###一般用来取文件或者路径
[root@localhost sub_str]# pathss=/root/tmp/sub_str/testprc.sh
[root@localhost sub_str]# echo ${pathss##*/}####取脚本名称;从左边开始阶段匹配'*/'的部分
testprc.sh
[root@localhost sub_str]#
[root@localhost sub_str]# echo ${pathss%/*}
/root/tmp/sub_str
[root@localhost sub_str]# echo ${pathss%%/*}
[root@localhost sub_str]#
[root@localhost sub_str]# echo ${pathss%/*} ####取脚本路径从左边开始阶段匹配'*/'的部分
/root/tmp/sub_str
[root@localhost sub_str]# echo ${pathss%%/*}
[root@localhost sub_str]#
[root@localhost sub_str]# dirname $pathss ##也有系统函数,但是没子串效率
/root/tmp/sub_str
[root@localhost sub_str]# basename $pathss ##也有系统函数,但是没子串效率
testprc.sh
[root@localhost sub_str]#
name="Mrxujbing" #该变量的值,有索引是从0,1,2,3,4...
${变量} 返回变量值
${#name} 返回变量长度
${变量:start} 返回变量start数值之后的字符串,且包含start的数字(start值就是索引值)
${变量:start:length} 提取start之后的length限制的字符,例如${name:4:1}
${变量#word} 从变量开头删除最短匹配的word子串
${变量##word} 从变量开头删除最长匹配的word子串
${变量%word} 从变量结尾删除最短匹配的word
${变量%%word} 从变量结尾开始删除最长匹配的word
替换
${变量/pattern/string} 用string 代替第一个匹配的pattern
${变量//pattern/string} 用string 代替所有匹配的pattern
注意:以上用法没改变变量内容;
扩展变量
设置默认值
- :- 如果变量为空,就返回后面的字符信息,可通过变量接收
- := 如果变量为空,赋值给变量,并返回其值
- :?如果变量为空,主动抛出信息,并传入标准错误输出信息
- :+ 当变量为空什么都不做,否则就返回其值给接收者
注意: ‘:=’改变了变量值
都还是再man bash 下面查parameter里找
shell补-变量变量赋值
- 直接赋值:oldman=666
- 引用其他命令结果赋值 ip =
hostname -l|awk'{print $2}'
- 交互式变量赋值:read -s 不显示输入的信息(隐藏) -t设置超时时间 -p指定输出/提shi
- 脚本传输:shell表示位置参数的特殊变量$1 $2 $3