免费注册 查看新帖 |

Chinaunix

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

shell中如何传递一个形参? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-07 14:08 |只看该作者 |倒序浏览
我写了一个shell脚本,假使是一个 1.sh
现在我要通过1.sh传递一个值出来如

sh ./1.sh aaa

我希望 aaa 在1.sh脚本中被赋值,使我执行完 1.sh之后
echo ${aaa} 有值,有这样的办法吗?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-05-07 14:51 |只看该作者
. ./urscript
BTW:如看不懂, 情参考置顶十三问

论坛徽章:
0
3 [报告]
发表于 2007-05-07 14:55 |只看该作者
看懂了,但是我不太愿意用 . 来执行啊,用 .执行的话 把待执行脚本的变量都弄来了啊 带来了太多的变量了啊,万一重了怎么办啊?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-05-07 19:03 |只看该作者
shell和其它语言是不同的,shell中返回值用来表示命令执行的错误代码,0表示成功,非0一定是失败。那么初学者常常困惑的就是子shell如何传回一个值?因为子shell中的变量是无法传回到父shell的,原因请参考相关资料,置顶的“十三问”就非常好。那么应该怎么做呢?除了烈火兄上面的.命令,这里再介绍几个小技巧:
1.用echo命令输出,在父shell中捕捉:
#!/bin/sh
echo "hello"
#end of sub.sh


var=$(sub.sh)
echo $var
hello

2.在子shell中输出赋值的命令,在父shell中eval这条命令

#!/bin/sh
echo 'var=hello'
#end of sub2.sh

eval $(sub2.sh)
echo $var
hello

3上面两种方法用在小脚本中倒是可以的,但脚本一大,需要输出的东西可能很多,这两个方法用起来就不是那么方便了。这时可以写到临时文件中,然后在父shell中读取。
#!bin/sh
echo 'var=hello' >tmp-file
#end of sub3.sh

sub3.sh
eval $(cat tmp-file)
echo $var
hello
rm tmp-file

论坛徽章:
0
5 [报告]
发表于 2007-05-07 19:57 |只看该作者
天使兄真是一个热心人,谢谢了!!!!

按您的意思就是 可以通过这样的方式返回

1 子shell里面 echo 父shell里面用 变量=`` 达到效果
2 子shell里面 写好在外面的赋值语句,比如外面传进来$1(外面是 aaa) 里面read一个变量 bbb我想把bbb传到外面就写好这样的赋值语句
echo "$1=$bbb" 那么输出的时候,$1扩展为 aaa $bbb 扩展为读入的值,但是我搞不清楚,为什么要用
eval
好比父shell 是1.sh 子shell是2.sh在父shell里面执行一下
sh ./2.sh 不就可以了吗? 它的输出是一条赋值语句执行了之后不就把值传出去了吗?

望指点一下,谢谢

[ 本帖最后由 kenancola 于 2007-5-7 20:24 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2007-05-08 08:58 |只看该作者
原帖由 kenancola 于 2007-5-7 19:57 发表
天使兄真是一个热心人,谢谢了!!!!

按您的意思就是 可以通过这样的方式返回

1 子shell里面 echo 父shell里面用 变量=`` 达到效果
2 子shell里面 写好在外面的赋值语句,比如外面传进来$1(外面是 aaa)  ...
sh ./2.sh 不就可以了吗? 它的输出是一条赋值语句执行了之后不就把值传出去了吗?...


sh ./2.sh是不行的,不信你可以试试看。 子shell里面的赋值命令在父shell看来只是一个字符串,并不了解它有什么特殊含义。要把它当作一条命令执行就必须eval。


——————————————
补充一下:
sh $(./2.sh)倒是可以把2.sh中输出作为命令执行,不过因为是在子shell中,变量仍旧无法传回。

[ 本帖最后由 woodie 于 2007-5-8 09:35 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP