免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3209 | 回复: 13
打印 上一主题 下一主题

循环中环境变量问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-29 14:14 |只看该作者 |倒序浏览
自己写了一个for循环, 嵌套的子程序需要调用上一级的环境变量, 可使每次执行的时候都提示:can't read "IP_ADDRESS": no such variable
    while executing
"echo $IP_ADDRESS"
    (file "./new2.sh" line 2)


如果单独执行第一级shell脚本,可以在脚本中通过echo命令成功显示出来变量的值,如果嵌套或执行完再用echo就获取不到变量值了. 请前辈们帮忙看看,指导一下.谢谢哈

script1.sh
#!/bin/sh
ip_address=`cat ip_address.txt`
for IP_ADDRESS in $ip_address; do
export IP_ADDRESS
echo $IP_ADDRESS
./subshell.sh
done



Subshell.sh
#!/usr/local/bin/expect -f
echo $IP_ADDRESS
set port 23
spawn telnet $IP_ADDRESS $port
... ...

论坛徽章:
0
2 [报告]
发表于 2009-12-29 14:24 |只看该作者
可以将$IP_ADDRESS 做为参数传给subshell.sh

论坛徽章:
0
3 [报告]
发表于 2009-12-29 14:25 |只看该作者
似乎是expect 本身的问题, 对expect不熟悉, 不能妄言.

论坛徽章:
0
4 [报告]
发表于 2009-12-29 14:26 |只看该作者

回复 #1 uuluck 的帖子

原因应该是不在同一个shell进程里面(父子),可以将IP_ADDRESS作为subshell.sh的参数,将值传递给subshell.sh
script1.sh
#!/bin/sh
ip_address=`cat ip_address.txt`
for IP_ADDRESS in $ip_address; do
export IP_ADDRESS
echo $IP_ADDRESS
./subshell.sh IP_ADDRESS
done




Subshell.sh
#!/usr/local/bin/expect -f
echo $1
set port 23
spawn telnet $1 $port
... ...

论坛徽章:
0
5 [报告]
发表于 2009-12-29 14:34 |只看该作者

回复 #4 wanzijiali 的帖子

谢谢wanzijiali, 刚才试过了,这一招似乎也走不通,仍然报错:
can't read "1": no such variable

论坛徽章:
0
6 [报告]
发表于 2009-12-29 14:35 |只看该作者
我已经用了export, 按理说脚本执行完后,还能直接通过执行 echo $IP_ADDRESS来显示变量的值, 可是却是空的. 不知道哪里出错了

论坛徽章:
0
7 [报告]
发表于 2009-12-29 14:43 |只看该作者
原帖由 wanzijiali 于 2009-12-29 14:26 发表
原因应该是不在同一个shell进程里面(父子),可以将IP_ADDRESS作为subshell.sh的参数,将值传递给subshell.sh
script1.sh
#!/bin/sh
ip_address=`cat ip_address.txt`
for IP_ADDRESS in $ip_address; do
...


从逻辑上看, 肯定不是什么'不在同一个shell进程里面(父子)' 的原因, 肯定跟expect本身的用法有关系,  expect估计不能识别shell定义的变量(无论是否是环境变量)

论坛徽章:
0
8 [报告]
发表于 2009-12-29 14:44 |只看该作者
原帖由 uuluck 于 2009-12-29 14:35 发表
我已经用了export, 按理说脚本执行完后,还能直接通过执行 echo $IP_ADDRESS来显示变量的值, 可是却是空的. 不知道哪里出错了


你的subshell 是expect脚本, 不是shell脚本!!你确定expect的脚本可以这样写?

论坛徽章:
0
9 [报告]
发表于 2009-12-29 14:49 |只看该作者
因为我对expect一点都不熟悉, 只能帮你分析, 如果expect 支持 stdin (我不知道, 你自己确定) , 应该可以这样用


for ...do;

expect <<EOF

echo $IP_ADDRESS
set port 23
spawn telnet $IP_ADDRESS $port
....
EOF
done

论坛徽章:
0
10 [报告]
发表于 2009-12-29 14:50 |只看该作者

回复 #7 nhw_cs 的帖子

谢谢nhw_cs兄, 好像是这样的.
我用一个系统变量作了测试,再shell脚本里面能识别出来,expect里面却是别不出来.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP