2018最新linux云计算集群架构师-第一阶段-Linux操作系统入门到精通-第19章-shell脚本基础-SHELL特殊变量

SHELL特殊变量

 

1.shell中单引号和双引号区别

 

‘’ 在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符。

 

“” 在双引号中,除了$, '', `和\以外所有的字符都解释成字符本身,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义

 

注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用

 

echo $VAR1
echo \$VAR1

#给变量值赋于多个单词,需要使用单引号和双引号
VAR8='xuegdo mk'
echo $VAR8

#赋值时单引号和双引号的区别
VAR8='xuegod mk $VAR1'
VAR9="xuegod mk $VAR1"   #双引中$符号有作用
echo $VAR8
echo $VAR9

#注:单引号之间的内容原封不动赋值给变量,	双引号之间的内容如有特殊符号会保留它的特殊含义

#删除变量
unset VAR1
echo $VAR1

 

2.环境变量

 

在bash shell中,环境变量分为两类:全局变量和局部变量

 

全局变量:对于shell会话和所有的子shell都是可见的

 

局部变量: 它只在自己的进程当中使用

 

#局部变量
VAR1=123
echo $VAR1
vim a.sh

 

修改文件 a.sh

 

#!/bin/bash
echo $VAR1

 

测试

 

echo $VAR1
bash a.sh   #执行a.sh 时,会使用另一个bash去执行,就访问不到$VAR1的值

 

实例

 

#env命令查看所全局变量
env
env | grep PATH

#使用export把这个局部变量输出为全局变量
export  VAR1=xuegod
echo $VAR1

vim a.sh   #写入以下内容

 

修改文件 a.sh 

 

#!/bin/bash
echo $VAR1

 

测试

 

bash a.sh   #引用全局变量成功

 

互动: 虽然我们设置了export全局变量,但是新开的xshell连接中,还是读不到变量VAR1,怎么办?

 

#让变量永久生效,可以把定义好的变量写入配置文件
#当登录系统或新开启一个ssh连接启动bash进程时,一定会加载这4个配置文件
vim /etc/profile    #系统全局环境和登录系统的一些配置
vim /etc/bashrc    #shell全局自义配置文件,用于自定义shell
vim /root/.bashrc   #用于单独自定义某个用户的bash
vim /root/.bash_profile  #用户单独自定义某个用户的系统环境

 

互动:如何知道新建一个ssh连接,加载这4个配置文件先后顺序?

 

有思路:1,没有思路:2

 

要会思考,思路很重要!

 

答:可以每个文件的最后,追加一个echo命令,输出一下文件的名字

 

echo 'echo  /etc/profile ' >> /etc/profile
echo 'echo  /etc/bashrc' >> /etc/bashrc
echo 'echo  /root/.bashrc ' >> /root/.bashrc
echo 'echo  /root/.bash_profile ' >> /root/.bash_profile
ssh root@192.168.1.63   #弹出以下信息,就知道有优先级了

 

/etc/profile

 

/etc/bashrc

 

/root/.bashrc

 

/root/.bash_profile

 

互动:知道加载的顺序有什么用?

 

可以在这里添加木马程序,只要管理登录系统,就触发木马程序! 现在大家知道学习操作系统原理的作用了吧。

 

echo 'touch  /tmp/profile.txt ' >> /etc/profile
echo 'touch  /tmp/bash_profile.txt ' >> /root/.bash_profile

#下面开始插入永久变量
vim /etc/profile   #在文件的最后插入 export VAR9=xuegod =等号两边不能有空格
source  /etc/profile   #重新加载profile文件

 

新打开的链接中,也有了

 

3.设置PATH环境变量

 

SHELL要执行某一个程序,它要在系统中去搜索这个程序的路径,path变量是用来定义命令和查找命令的目录,当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个

 

path路径内,就可以在全局调用这个第三方程序的

 

vim /opt/backup

 

修改文件 backup

 

#!/bin/bash
echo "Backup data is OK!"

 

测试

 

chmod +x /opt/backup
/opt/backup
backup  #未找到命令...

#将backup命令添加PATH中 
PATH=/opt/:$PATH
backup   #发现命令可以直接执行了,不用写全路径了
vim /etc/profile  # 在文件最后追加以下内容,永久生效   

 

修改文件 /etc/profile

 

#在文件最后追加以下内容,永久生效
export PATH=/opt/:$PATH

 

加载配置文件,使用配置生效

 

source  /etc/profile   #重新加载配置文件,使用配置生效

 

4.shell位置变量

 

Shell解释执行用户的命令时,将命令行的第一个字符作为命令名,而其它字符作为参数。

 

$0 获取当前执行shell脚本的文件文件名,包括脚本路径,命令本身

 

$n 获取当前脚本的第n个参数 n=1,2.....n 当n大于9时 用${10}表示。

 

vim print.sh 

 

修改文件 print.sh

 

#!/bin/bash
echo "本shell脚本的文件名: $0"
echo "第1个参数:  $1"
echo "第2个参数:  $2"
echo "第3个参数:  $3"
echo "第4个参数:  $4"

 

测试

 

chmod +x print.sh
./print.sh 111  222 a.txt  444

 

本shell脚本的文件名: ./print.sh

 

第1个参数: 111

 

第2个参数: 222

 

第3个参数: a.txt

 

第4个参数: 444

 

使用场景:服务器启动传参数

 

/etc/init.d/network restart

 

5.特殊变量

有些变量是一开始执行Script脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。这些变量当一执行程序时就有了,以下是一些特殊变量:

$*

以一个单字符串显示所有向脚本传递的参数;

如"$*"用【"】括起来的情况、以"$1 $2 … $n"的形式输出所有参数

$#

传递到脚本的参数个数

$$

当前进程的进程号PID

$?

显示最后命令的退出状态;0表示没有错误,其他任何值表明有错误

$!

后台运行的最后一个进程的进程号pid

实例

#!/bin/bash
echo "$* 表示这个程序的所有参数 "
echo "$#  表示这个程序的参数个数"
echo "$$  表示程序的进程ID "
touch /tmp/b.txt &
echo "$!  执行上一个后台指令的PID"
echo "$$  表示程序的进程ID "
echo "$? 表示上一个程序执行返回结果

执行

bash special_variable.sh  11 22 33 44 55

结果  

11 22 33 44 55 表示这个程序的所有参数

11 22 33 44 55 表示这个程序的所有参数

5  表示这个程序的参数个数

45502  表程序的进程ID

45504  执行上一个后台指令的PID

45502  表程序的进程ID

0 表示上一个程序执行返回结果

 

实例

创建文件

#常用的环境变量
cd /opt
vim env.sh

添加代码 

#!/bin/bash
echo $HOME
echo $PATH
echo $PWD

运行

bash env.sh

结果

/root

/opt/:/opt/:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin

/opt  

posted on 2019-11-06 18:54  herisson_pan  阅读(15)  评论(0)    收藏  举报

导航