你能知道的或者不知道的shell变量都在这里

2 shell变量讲解

2.1 shell中的变量讲解

2.1.1 什么是shell变量

  • 变量的本质就是内存中的一块区域 变量名 位置
  • 变量是脚本中经常会使用的内容信息
  • 变量可以在脚本中直接使用
  • 不同变量的类型存放不同的数据信息

2.1.2 变量怎么赋值使用

  1. 直接赋值使用    username="张三"
  2. 引用其他命令执行的结果在赋值    ip_eth0=`hostname -I | awk '{print $1}'`
  3. 使用交互式方式:read -p
  4. 使用传参方式:脚本 $1 $2

2.1.3 envsetdeclareexport区别

env

set

declare

export

显示用户的环境变量

显示当前shell定义的变量,包括环境变量

显示shell中的所有变量

显示当前导出的shell为环境变量的变量

 

2.1.4 环境变量(全局变量)

2.1.4.1 环境变量常见的特点

  1. 变量都是大写的
  2. 变量都是在linux中基本使用
  3. 变量都是系统中的

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 行为审计项目出现的问题

  • 上图发现切换未普通用户的时候无法记录
  • 解决办法
  1. 给其他用户加上写的权限
    1. 第一个是会造成其他用户也可以往里面记录内容,不安全
  2. 给文件加锁(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 局部变量的特点

  1. 用户自己定义的变量
  2. 不以数字为开头的变量
  3. 不要占用系统变量
  4. 变量命名尽量以下划线为分割的方式命名
  5. 变量命名尽量写成驼峰航线那样的(age_Version_Lyx=24)
  6. 变量命名尽量让别人一看就可知道是干什么
  7. 变量的名称如果多个字符连接在一起,尽量使用{}来区别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个参数为什么数字没有问题,而字母出现问题
  1. 这个是因为$10和以后的变量,都将$10以为成$1加一个数字造成的问题
  • 解决
  1. 将每每个参数都加上大括号

 

  1. 再次查看

2.1.5.1.2 $*和$@的区别
  1. 测试数据

[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

  1. 执行的结果,会发现当$*加上""的时候,会将所有的参数当成一个整体进行输出
  2. 执行的结果发现,当在脚本页面将参数用引号引起来,会发现$*也会将整体进行输出

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服务为宗旨解决)
  1. 查找nginx的进程pid

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

  1. 访问nginx首页文件

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

2.1.5.3.3 linux杀手三人组
  1. kill (信号) pid值
  2. pkill +服务名称(切记他会进行模糊匹配,杀死所有差不多的)
  3. 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 ~] #

  1. 统计大于等于6字符的单词

    1. 方法一:利用变量${#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

  1. 方法二:利用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

  1. 方法三:利用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] #

 

posted @ 2020-01-07 12:38  HXX-LYX  阅读(323)  评论(0编辑  收藏  举报