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) 收藏 举报
浙公网安备 33010602011771号