免费注册 查看新帖 |

Chinaunix

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

". file"调用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-12 16:43 |只看该作者 |倒序浏览
本帖最后由 lihangel 于 2010-06-12 16:49 编辑

简单说明问题的现象是这样的,有一脚本a.ksh,作用是根据后面的参数生成新的变量"USERS",独立工作时,一切正常,如下例:
  1. bash-2.03$ cat a.ksh
  2. #!/bin/ksh

  3. LOG_A=/tmp/$0.log
  4. echo "[A] my log is $LOG_A"

  5. USERS=$@:groupA
  6. echo "[A] (user/group) $USERS"



  7. bash-2.03$ ./a.ksh alex jhon william
  8. [A] my log is /tmp/./a.ksh.log
  9. [A] (user/group) alex jhon william:groupA
复制代码
此时a.ksh的$0 $1 $2 $3 分别为./a.ksh alex jhon william


问题就出现在这,当另一脚本b.ksh需要使用参数"USERS",在程序中调用a.ksh($1)时,
. $1 $@
a.ksh的输出发生了变化,如下
  1. bash-2.03$ cat b.ksh
  2. #!/bin/ksh

  3. LOG_B=/tmp/$0.log
  4. echo "[B] my log is $LOG_B"

  5. . $1 $@
  6. echo "[B] (user/group) $USERS"



  7. bash-2.03$ ./b.ksh ./a.ksh alex jhon william
  8. [B] my log is /tmp/./b.ksh.log
  9. [A] my log is /tmp/./b.ksh.log
  10. [A] (user/group) ./a.ksh alex jhon william:groupA
  11. [B] (user/group) ./a.ksh alex jhon william:groupA
复制代码
大家可以看到,此时a.ksh的$0 $1 $2 $3 $4 分别为./b.ksh ./a.ksh alex jhon william
结果就是a.ksh的LOG文件名发生了变化,而且参数多了一位,这与我们期望的结果不符,不知道大侠们有没好的解决办法?多谢了

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
2 [报告]
发表于 2010-06-12 16:52 |只看该作者
记得是用双引号把2个引起来就可以了。这样就是一个参数了。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
3 [报告]
发表于 2010-06-12 17:05 |只看该作者
技术贴。
你的意思我明白了,就是把参数往左移动一次,shift应该就可以了。

论坛徽章:
0
4 [报告]
发表于 2010-06-12 17:11 |只看该作者
回复 3# expert1


    shift 可以移动$1 $2 $3 ....  但$0还是错误的,依然是./b.ksh,求解

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
5 [报告]
发表于 2010-06-12 17:33 |只看该作者
hehe,$0是./b.ksh处理的过程是没错的。但是不符合你的要求,

但是你这里怎么搞我还真不清楚。你要获取名字,可以变通一下。可以用$1试试看。呵呵。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
6 [报告]
发表于 2010-06-12 17:38 |只看该作者
LOG_B=/tmp/$0.log

echo "[B] my log is $LOG_B"

这里可以加工一下获取你想要的a.ksh
然后再执行就可以了。两全其美的办法我还真不懂怎么搞。

论坛徽章:
0
7 [报告]
发表于 2010-06-13 09:36 |只看该作者
回复 5# expert1


    非常感谢您的关注与帮助,我们暂时的解决方法就是这样的。不过,这样做也有弊端,a.ksh独立运行又不正常了。等待完美解决方案。

其实,获取参数不一定非得用. $1 $@这种方式,可以考虑其它方法,但前提是最好不要对a.ksh做改动。谢谢各位了

论坛徽章:
0
8 [报告]
发表于 2010-06-13 11:25 |只看该作者
本帖最后由 jinl 于 2010-06-13 11:39 编辑

不知道 你需要完成什么目的 。如果只是为了显示后面的参数 可以如下处理
  1. b.sh
  2. #!/bin/ksh

  3. LOG_B=/tmp/$0.log
  4. echo "[B] my log is $LOG_B"
  5. PROM=$1
  6. shift
  7. $PROM $@

  8. [A] (user/group) alex jhon william:groupA

复制代码
如果想把a.sh的变量在b中使用,我觉得可以通过管道来处理

  1. $PROM $@ >tmp.file
  2. USER=$(awk -F[\):] ‘NR==2 {print $2}')
  3. echo $USER
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
9 [报告]
发表于 2010-06-13 11:40 |只看该作者
回复 8# jinl


楼主希望的结果是这样:
#./b.ksh ./a.ksh alex jhon william
[B] my log is /tmp/./b.ksh.log
[A] my log is /tmp/./a.ksh.log
[A] (user/group) alex jhon william:groupA
[B] (user/group) ./a.ksh alex jhon william:groupA

你的方法不能实现

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
10 [报告]
发表于 2010-06-13 11:52 |只看该作者
a.bash:
  1. #!/bin/bash

  2. myself=$0
  3. [[ "${BASH_SOURCE[0]}" != "${0}" ]] && myself=${BASH_SOURCE[0]}

  4. LOG_A=/tmp/${myself}.log
  5. echo "[A] my log is $LOG_A"

  6. USERS=$@:groupA
  7. echo "[A] (user/group) $USERS"
复制代码
b.bash:
  1. #!/bin/bash

  2. LOG_B=/tmp/$0.log
  3. echo "[B] my log is $LOG_B"

  4. arg1=$1
  5. shift
  6. . $arg1 $@
  7. echo "[B] (user/group) $USERS"
复制代码
ksh还没有想到好的方法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP