2013-02-08 32 views
2

我改变它的结构如图这样的bash脚本:坐落在bash脚本VS功能参数

#somewhere in the code 
sim_counts=#... some value 
function_name() 
{ 
    set $sim_counts 
    for hostname in $linux_hostnames; do 
     if [ $1 -eq 0 ]; then # if sim_counts equal 0 
      shift # jump forward in sim_counts 
      continue 
     fi 
    # ... more code 
    shift 
    done 
} 

然后它被调用的脚本:

function_name 

我想给这个功能介绍一个参数:

#somewhere in the code 
sim_counts=#... some value 
function_name() 
{ 
    ip=$1 
    set $sim_counts 
    for hostname in $linux_hostnames; do 
     if [ $1 -eq 0 ]; then # if sim_counts equal 0 
      shift # jump forward in sim_counts 
      continue 
     fi 
    # ... more code 
    shift 
    done 
} 

并调用方式如下功能:

function_name 10.255.192.123 

我应该怎么做,以避免功能参数和set命令其他价值的$1冲突?

+0

'$ sim_counts'代表什么? – 2013-02-08 14:56:22

+0

@JonahBishop这是在特定机器上启动的进程值。 – Patryk 2013-02-08 15:02:40

+1

由于您在调用'set'之前将函数的参数保存为'ip',我不确定是否存在真正的冲突。那就是说,为什么你需要在这里使用'set'?难道你不能像'$ 1'那样使用'sim_counts'吗? – chepner 2013-02-08 15:04:36

回答

2

如果我正确阅读Bash参考手册中的set builtin page,我相信你写的代码将会正常工作。从该页面引用:

其余的N个参数是位置参数,按顺序分配给$ 1,$ 2,... $ N。特殊参数#设置为N.

实质上,位置变量的任何预先存在的值将被吹走。该手册页上的第一句话也很有趣:

这个内建是如此复杂,它值得自己的部分。

总之,我认为你的代码应该只是按预期工作。您已将初始值$1(来自函数调用)保存到临时变量中;只要你提到$ip具体的价值,你应该是好的。在我自己的测试脚本中,看起来$1会像我预期的那样被吹走。

+0

你说得对。 '$ ip'正确,'$ 1'分配给'$ sim_counts'。谢谢。 – Patryk 2013-02-08 15:10:37