shell补-变量再见变量

发布时间 2023-12-15 10:29:26作者: WeChat2834
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