你能知道的或者不知道的shell变量都在这里
第2章 shell变量讲解
2.1 shell中的变量讲解
2.1.1 什么是shell变量
- 变量的本质就是内存中的一块区域 变量名 位置
- 变量是脚本中经常会使用的内容信息
- 变量可以在脚本中直接使用
- 不同变量的类型存放不同的数据信息
2.1.2 变量怎么赋值使用
- 直接赋值使用 username="张三"
- 引用其他命令执行的结果在赋值 ip_eth0=`hostname -I | awk '{print $1}'`
- 使用交互式方式:read -p
- 使用传参方式:脚本 $1 $2
2.1.3 env、set、declare、export区别
|
env |
set |
declare |
export |
|
显示用户的环境变量 |
显示当前shell定义的变量,包括环境变量 |
显示shell中的所有变量 |
显示当前导出的shell为环境变量的变量 |
2.1.4
环境变量(全局变量)
2.1.4.1 环境变量常见的特点
- 变量都是大写的
- 变量都是在linux中基本使用
- 变量都是系统中的
2.1.4.2 常见的环境变量
|
环境变量 |
含义 |
用于场景 |
|
LANG |
记录字符集信息(LANG=zh_CN.UTF-8) |
centos6:/etc/sysconfnig/i18n centos7:/etc/locale.conf |
|
PS1 |
记录命令提示符 |
|
|
PATH |
记录命令路径,执行命令的时候会调用此环境变量查看是否有相关的命令路径信息 |
执行命令 |
|
UUID |
记录用户的UUID信息 |
判断ID是不是root |
|
HOSTNAME |
主机名信息 |
|
|
历史相关的 |
||
|
HISTSIZE |
命令记录的最多条数 |
vim /etc/profile 46 HISTSIZE=1000 |
|
HISTFILESIZE |
文件记录的最多条数 |
~/.bash_profile |
|
HISTFILE |
指定历史记录的文件名字 |
~/.bash_profile |
|
TIMEOUT |
不进行操作,自动断开时间 |
|
|
HISTCONTROL |
记录history命令是否记录以空格开头的命令 |
[root@m01 ~] # vim ~/.bashrc HISTCONTROL=ignorespace |
|
PROMPT_COMMAND |
存放的脚本命令会在下一个命令运行前执行 |
用户行为审计项目 |
2.1.4.3 用户审计项目
2.1.4.3.1 设置用户操作的内容和时间信息追加到/var/log/audit.log
export PROMPT_COMMAND='echo `history 1 `########`date +%F_%T`###`who am i | cut -d" " -f1` >> /var/log/audit.log'
2.1.4.3.2 验证(用户输入命令查看网卡信息)

2.1.4.3.3 行为审计项目出现的问题

- 上图发现切换未普通用户的时候无法记录
- 解决办法
- 给其他用户加上写的权限
- 第一个是会造成其他用户也可以往里面记录内容,不安全
- 给文件加锁(chattr +a)
[root@m01 ~] # ll /var/log/audit.log
-rw-r--r-- 1 root root 6676 Jan 6 15:37 /var/log/audit.log
[root@m01 ~] # chmod o+w /var/log/audit.log
[root@m01 ~] # chattr +a /var/log/audit.log
[root@m01 ~] # su - lyx
Last login: Mon Jan 6 15:36:57 CST 2020 on pts/0
2.1.5
普通变量(局部变量)
2.1.5.1 局部变量的特点
- 用户自己定义的变量
- 不以数字为开头的变量
- 不要占用系统变量
- 变量命名尽量以下划线为分割的方式命名
- 变量命名尽量写成驼峰航线那样的(age_Version_Lyx=24)
- 变量命名尽量让别人一看就可知道是干什么
- 变量的名称如果多个字符连接在一起,尽量使用{}来区别name=lyx echo ${name}18
2.1.5 特殊变量
- 提高脚本的书写效率,执行效率
- 判断服务的状态信息,脚本参数信息删除、替换
2.1.5.1 表示位置
|
位置信息 |
含义 |
例子 |
|
$0 |
表示当前的shell脚本名称 |
[root@m01 test_init] # cat para_0.sh #!/bin/bash echo $0 [root@m01 test_init] # sh para_0.sh para_0.sh |
|
$n(1..n) |
表示脚本的第几个参数信息 |
[root@m01 test_init] # cat para_0.sh #!/bin/bash echo $1 [root@m01 test_init] # sh para_0.sh oldboy oldboy [root@m01 test_init] # |
|
$# |
表示一共有几个参数 |
[root@m01 test_init] # cat para_0.sh #!/bin/bash echo $1 $2 $3 echo $# [root@m01 test_init] # sh para_0.sh oldboy oldgilr oldbaby oldboy oldgilr oldbaby 3 [root@m01 test_init] # |
|
$* |
返回脚本所有的参数信息 |
[root@m01 test_init] # cat para_0.sh #!/bin/bash echo $1 $2 $3 echo "################################" echo $* echo "#################################" echo $@ [root@m01 test_init] # sh para_0.sh oldboy oldgilr oldbaby oldboy oldgilr oldbaby ################################ oldboy oldgilr oldbaby ################################# oldboy oldgilr oldbaby [root@m01 test_init] # |
|
$@ |
返回脚本所有的参数信息 |
[root@m01 test_init] # cat para_0.sh #!/bin/bash echo $1 $2 $3 echo "################################" echo $* echo "#################################" echo $@ [root@m01 test_init] # sh para_0.sh oldboy oldgilr oldbaby oldboy oldgilr oldbaby ################################ oldboy oldgilr oldbaby ################################# oldboy oldgilr oldbaby [root@m01 test_init] # |
2.1.5.1.1 $n常见的问题

- 同样传递20个参数为什么数字没有问题,而字母出现问题
- 这个是因为$10和以后的变量,都将$10以为成$1加一个数字造成的问题
- 解决
- 将每每个参数都加上大括号

- 再次查看

2.1.5.1.2 $*和$@的区别
- 测试数据
[root@m01 test_init] # vim para_0.sh
#!/bin/bash
echo "nomarl"
for i in $*
do
echo $i
done
for m in $@
do
echo $m
done
echo "##################################"
echo "unnomarl"
for i in "$*"
do
echo $i
done
for m in "$@"
do
echo $m
done

- 执行的结果,会发现当$*加上""的时候,会将所有的参数当成一个整体进行输出
- 执行的结果发现,当在脚本页面将参数用引号引起来,会发现$*也会将整体进行输出
2.1.5.2 表示状态变量的
|
状态 |
含义 |
例子 |
|
$? |
对上一个命令执行的返回值进行判断,0为成功,非0为不成功 |
[root@m01 test_init] # cat aa cat: aa: No such file or directory [root@m01 test_init] # echo $? 1 [root@m01 test_init] # cat /etc/passwd | tail -1 lyx:x:1032:1035::/home/lyx:/bin/bash [root@m01 test_init] # echo $? 0 [root@m01 test_init] # |
|
$$ |
表示当前脚本的pid值 |
[root@m01 test_init] # echo $$ 2859 [root@m01 test_init] # |
|
$! |
表示上一个脚本运行的pid值 |
[root@m01 test_init] # echo $! [root@m01 test_init] # |
|
$_ |
返回上一个脚本或者命令最后参数的信息(相当于esc+.) |
[root@m01 test_init] # cat /etc/hosts [root@m01 test_init] # echo $_ /etc/hosts [root@m01 test_init] # |
2.1.5.3 扩展一些内容(和shell没关系)
2.1.5.3.1 tee的用法
- tee重定向内容,并且在脚本执行的过程中会将结果输出来
- tee -a 重定向追加内容,并且在脚本执行的过程中会将结果输出来
[root@m01 test_init] # vim para_0.sh
#!/bin/bash
touch /server/scripts/test_init/1.txt
echo aa | tee -a /server/scripts/test_init/1.txt
2.1.5.3.2 starce追踪进程执行过程(以访问nginx服务为宗旨解决)
- 查找nginx的进程pid

- 使用strace来指定要监控的pid信息

- 访问nginx首页文件

- strace进行监控查找详细的信息

2.1.5.3.3 linux杀手三人组
- kill (信号) pid值
- pkill +服务名称(切记他会进行模糊匹配,杀死所有差不多的)
- killall 服务名称精确
2.1.4.3 表示变量子串的
- 格式:${comments}
- 变量子串效率比使用相应命令效率更高
|
变量子串 |
含义 |
例子 |
|
${parameter} |
返回变量的内容 |
[root@m01 ~] # aa=123456 [root@m01 ~] # echo $aa 123456 [root@m01 ~] # |
|
${#parameter} |
返回变量$parameter的长度 |
[root@m01 ~] # aa=123456 [root@m01 ~] # echo ${#aa} 6 [root@m01 ~] # |
|
${parameter:offset:length} |
返回变量值parameter中,从offset这个位置开始截取,一共截取length的长度 |
[root@m01 ~] # aa=123456 [root@m01 ~] # echo ${aa:2:3} 345 [root@m01 ~] # |
|
${parameter#word} |
以变量值parameter开头,删除最短匹配word的变量 |
[root@m01 ~] # aa=word123word [root@m01 ~] # echo ${aa#*ord} 123word |
|
${parameter##word} |
以变量parameter开头,删除最长匹配word的变量 |
[root@m01 ~] # [root@m01 ~] # aa=word123word [root@m01 ~] # echo ${aa#*ord} 123word [root@m01 ~] # echo ${aa##*ord} |
|
${parameter%word} |
以变量parameter结尾,删除最短匹配word的变量 |
[root@m01 ~] # aa=123word123word [root@m01 ~] # echo ${aa%*ord} 123word123w [root@m01 ~] # |
|
${parameter%%word} |
以变量parameter结尾,删除最长匹配word的变量 |
[root@m01 ~] # aa=123word123word [root@m01 ~] # echo ${aa%*ord} 123word123w [root@m01 ~] # echo ${aa%%*ord} |
|
${parameter/find comments/replace parameter} |
使用replace parameter来替换匹配到的第一个find comments |
[root@m01 ~] # aa=123word123word [root@m01 ~] # echo ${aa/123/456} 456word123word [root@m01 ~] # |
|
${parameter//find comments/replace parameter} |
使用replace parameter来替换匹配到的所有find comments |
[root@m01 ~] # [root@m01 ~] # aa=123word123word [root@m01 ~] # echo ${aa//123/456} 456word456word [root@m01 ~] # |
统计大于等于6字符的单词
- 方法一:利用变量${#i}来取值
[root@m01 test_init] # vim para_0.sh
#!/bin/bash
str=`echo "I am oldboy linux,welcome to our training."| sed -r 's#[ ,.]# #g'`
for i in $str
do
if [ ${#i} -ge 6 ]
then
echo $i
fi
done
- 方法二:利用awk循环得知
[root@m01 test_init] # echo "I am oldboy linux,welcome to our training." | awk -F"[ ,.]+" '{for(i=1;i<=NF;i++) if(length($i)>6) print $i}'
welcome
training
- 方法三:利用awk的内置变量
[root@m01 test_init] # echo "I am oldboy linux,welcome to our training." | awk -vRS="[ ,.]+" 'length()>6'
welcome
training
[root@m01 test_init] #
2.1.6 变量扩展
|
变量 |
含义 |
例子 |
|
${parameter:-word} |
如果变量是空值,假装将word赋值给parameter变量,但是返回值还是空的 |
[root@m01 test_init] # echo ${aa} [root@m01 test_init] # echo ${aa:-word} word [root@m01 test_init] # echo ${aa} |
|
${parameter:-word} |
如果变量是空值,将word赋值给parameter变量,返回值为word |
[root@m01 test_init] # echo ${aa:=word} word [root@m01 test_init] # echo ${aa} word [root@m01 test_init] # |
|
${parameter:?word} |
如果变量是空值,那么就把word值作为错误值输出出来 |
[root@m01 test_init] # echo ${aa} [root@m01 test_init] # echo ${aa?word} -bash: aa: word [root@m01 test_init] # |
|
${parameter:+word} |
如果变量值是有的,则把值替换成word值,如果变量没有值,则不进行替换 |
[root@m01 test_init] # aa=123 [root@m01 test_init] # echo ${aa} 123 [root@m01 test_init] # echo ${aa:+word} word [root@m01 test_init] # echo ${aa} 123 [root@m01 test_init] # |
你能知道的或者不知道的shell变量都在这里的更多相关文章
- 你可能不知道的Shell
Shell也叫做命令行界面,它是*nix操作系统下用户和计算机的交互界面.Shell这个词是指操作系统中提供访问内核服务的程序. 这篇文章向大家介绍Shell一些非广为人知.但却实用有趣的知识,权当品 ...
- 你可能不知道的陷阱, IEnumerable接口
1. IEnumerable 与 IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...
- swift与OC之间不得不知道的21点
swift与OC之间不得不知道的21点 自6月的WWDC大会上由苹果的大神Chris Lattner向我们首次展示swift至今已经大半年时间了,虽然绝大部分软件公司代码里还都见不到一丁点swif ...
- 你所不知道的15个Axure使用技巧
你有用原型开发工具吗?如果有,那你用的是Axure还是别的? 从以前就喜欢使用Axure,主要是觉得它能清楚的表达设计的思路,还有交互的真实再现,能让看的人一目了然,昨天看了这篇博文,便更加确定Axu ...
- Java你可能不知道的事(3)HashMap
概述 HashMap对于做Java的小伙伴来说太熟悉了.估计你们每天都在使用它.它为什么叫做HashMap?它的内部是怎么实现的呢?为什么我们使用的时候很多情况都是用String作为它的key呢?带着 ...
- java你可能不知道的事(2)--堆和栈
在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...
- Windows2003 SQL2005解决系统Administrator密码不知道的问题
Windows2003 SQL2005解决系统Administrator密码不知道的问题 今天上班的时候,有个同事说不知道谁设置了开机密码,那台电脑一直没有开机密码的他现在进不了桌面 那台电脑没有光驱 ...
- [iOS翻译]《iOS 7 Programming Pushing the Limits》系列:你可能不知道的Objective-C技巧
简介: 如果你阅读这本书,你可能已经牢牢掌握iOS开发的基础,但这里有一些小特点和实践是许多开发者并不熟悉的,甚至有数年经验的开发者也是.在这一章里,你会学到一些很重要的开发技巧,但这仍远远不够,你还 ...
- ES6 你可能不知道的事 – 基础篇
序 ES6,或许应该叫 ES2015(2015 年 6 月正式发布),对于大多数前端同学都不陌生. 首先这篇文章不是工具书,不会去过多谈概念,而是想聊聊关于每个特性 你可能不知道的事,希望能为各位同学 ...
随机推荐
- [SPDK/NVMe存储技术分析]014 - (NVMe over PCIe)Host端的命令处理流程
NVMe over PCIe最新的NVMe协议是1.3. 在7.2.1讲了Command Processing流程.有图有真相. This section describes command subm ...
- Java基础 (下)
泛型 Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符? Java 泛型(generics) 是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时 ...
- HTTP发展史,HTTP1.1与HTTP2.0的区别
前言 我们知道HTTP是浏览器中最重要且使用最多的协议,它不仅是浏览器与服务端的通信语言,更是互联网的基石.随着浏览器的不断更新迭代,HTTP为了适应技术的更新也在不断进化,学习HTTP的最佳途径就是 ...
- 图解CompletableFuture源码
前言 关于CompletableFuture源码解析部分,整体上感觉还是写比较难的,不过为了推广到团队还是要好好搞一下的,我还是希望大家看到这边文章能学到点什么,废话不多说开始吧. 属性部分 首先看属 ...
- 这些OAuth2客户端的认证方式你未必了解
OAuth2客户端按照它们与授权服务器进行安全认证的能力可以分为机密类型(Confidential)和公共类型(Public). 机密类型的自身会有个密码凭据,比如Web服务器后端程序:而公共类型则没 ...
- Shiro集成多个Realm,认证都不通过返回y configured realms. Please ensure that at least one realm can authenticate these tokens.
异常内容:Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] could not be ...
- Springmvc入门基础(二) ---架构详解
1.框架结构图 架构流程文字说明 用户发送请求至前端控制器DispatcherServlet DispatcherServlet收到请求调用HandlerMapping处理器映射器. 处理器映射器根据 ...
- 面试问题之C++语言:Overload、Override及Overwirte的区别
Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载. 特点: (1)相同的范围(在同一个类中) (2)函数名 ...
- MySQL 中有哪些不同的表格?
共有 5 种类型的表格: 1.MyISAM 2.Heap 3.Merge 4.INNODB 5.ISAM
- idea推送项目到github
参考: https://blog.csdn.net/SoWhatWorld/article/details/103817786?depth_1-utm_source=distribute.pc_rel ...