设为首页 收藏本站
查看: 812|回复: 0

shell采坑之旅--变量$PWD引发的血案

[复制链接]

尚未签到

发表于 2018-8-20 10:35:16 | 显示全部楼层 |阅读模式
  背景:
  分组自研的数据库审计平台已在windows环境下,实现了一键拉取Oracle数据库性能报告的功能。
  最近接到审计平台开发的小任务:将windows环境下实现一键拉取oracle数据库性能报告的bat脚本改为linux下的
  shell脚本。
  脚本改写的很快,三百多行的bat脚本,半天就改写成了shell,接下来就是最痛苦的测试环节了。
  踩坑开始:
  bat脚本在定义变量时,将连接数据库的密码定义为名为PWD的变量(如下),踩坑由此开始。。。
  

@echo off  
...
  
set PWD=xxx
  
...
  

  

  我在定义连接oracle的用户密码时,便参照bat脚本,仍使用PWD作为密码变量:
  

#################setting variables######################  

  

  
TNS=dbname
  
PWD=pass1234
  

  

  
#################Making gather&scan Files######################
  

  

  
sqlplus dbaudit/$PWD@$TNS sqlplus.log          --第1部分
  
here is command1!
  
EOF
  

  

  
#################Spooling Reports######################
  
cd $SHELL_PATH/$1
  
echo -e "Spooling Reports..."
  
for(( i = 0; i < 10; i++ ))
  
do
  
{
  sqlplus dbaudit/$PWD@$TNS sqlplus.log      --第2部分
  here is command2!
  EOF
  
}&
  
done
  
wait
  

  

  

  为了拉取oracle报告,在脚本中有多次连接数据库的操作:
  

sqlplus username/$PWD@$TNS sqlplus.log  
...
  
EOF
  

  脚本看起来毫无破绽,可是执行时第1部分的sqlplus命令时,可以成功连接数据库,并执行相关操作;而执行到脚本第2部分的sqlplus命令时,却总是报sqlplus的语法错误!
  这是为何呢?!
  思来想去无果,百度是不可能有结果了,因为报错很直白,就是sqlplus语法不对。
  

Spooling Reports...  


  
SQL*Plus:>  

  
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
  


  
SQL*Plus:>  

  
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
  

  
Use SQL*Plus to execute SQL, PL/SQL and SQL*Plus statements.
  

  
Usage 1: sqlplus -H | -V
  

  -H             Displays the SQL*Plus version and the
  usage help.
  -V             Displays the SQL*Plus version.
  

  
Usage 2: sqlplus [ [] [{logon | /nolog}] [] ]
  

  于是,将变量部分和报错部分的脚本提取出,写在test.sh中单独执行,邪门的事情发生了,执行过程很成功!
  奇怪了,脚本前后同样的命令,前面的成功,后面的失败了,why?!
  仔细阅读脚本,中间只有一次“cd $SHELL_PATH/$1”的命令,难道是这个命令导致的?不应该呀!
  继续将报错脚本拿出来单独执行,一次偶然的&quot;echo $PWD&quot;揭示了真相!
  

[padba@cnsz081003 ~]$ echo $PWD  
/paic/dba/tmp/padba
  

  纳尼!PWD居然是linux系统自带的变量,而且显示的就是当前目录!
  于是推断,在执行“cd $SHELL_PATH/$1”这样的change directory命令后,系统的PWD变量覆盖了脚本开始时
  定义的PWD=pass1234,也就是说,在切换目录后,PWD的值就不是&quot;pass1234&quot;了,而是一个目录,也就是&quot;$SHELL_PATH/$1&quot;对应的值!
  验证推断:
  

[padba@cnsz081003 ~]$ export PWD=pass1234   --手动定义PWD变量  
[padba@cnsz081003 pass1234]$ echo $PWD
  
pass1234                                    --显示PWD变量值为pass1234,没毛病!
  
[padba@cnsz081003 pass1234]$ cd             --切换目录
  
[padba@cnsz081003 ~]$ echo $PWD
  
/paic/dba/tmp/padba                         --PWD的值变为当前目录!
  

  至此,真相大白!
  修改脚本中的PWD为PASSWD后,报错消失,脚本顺利完成拉取报告的使命!
  总结:
  linux中有许多类似$PWD这类的变量,我们在脚本中定义变量名时,要避开系统自带的变量名,否则会导致灰常奇怪且让人欲罢不能的ERROR!



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554180-1-1.html 上篇帖子: 每日一道shell脚本练习(02) 下篇帖子: 关于Shell脚本read传参问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表