无法从函数中评估脚本参数

时间:2013-09-29 03:31:58

标签: bash parameters arguments bash4

我已经开始再次编写shell脚本了,我发现自己经常需要编写调试回显以跟踪脚本正在做什么。我以前这么简单的做法是写下这样的东西:

#!/bin/bash
myVar = 'Erractic Nonesense'
echo "myVar: $myVar" 

==> myVar: Erractic Nonesense

这很好用而且非常简单但是,我必须为每个我希望追踪的变量写这个很累,而且作为一个认为用更少的代码来做更多东西的人很棒,我写了一个函数:

#!/bin/bash
dbg() # $msg
{
    echo "$@: ${!@}" 
}

myVar = 'Erractic Nonesense'
dbg myVar

==> myVar: Erractic Nonesense

这适用于常规变量,但对于脚本参数($ 1,$ 2等),它不起作用。为什么呢?

==> $ ./myScript 123

#!/bin/bash
...
dbg 1 # This is the bugger in question.

==> 1: 1

而且,这怎么能被规避呢?

编辑

感谢Barmar我现在明白为什么它会这样,但第二个问题仍然存在。

编辑2

使用koodawg的想法,这就是结果。有用。 已更新,请参阅编辑4

编辑3

我认为 EDIT 2 set +-x的混合将是一个可行的解决方案。

编辑4

更新了落在参数上的逻辑,因为前一个参数并不总是有效。添加了精美的标签。

RX_INTEGER='^[0-9]+$'
DBG_SCRIPT_ARGS=( "$0" "$@" )
DBG_PADDING="        " # tabs of 8 spaces
dbg() # $msg | OUT$args OUT$res
{    
    args=$@
    [[ $args =~ $RX_INTEGER ]] && res="${DBG_SCRIPT_ARGS[args]}" || res="${!@}"
    printf "%s%s\`%s\`\n" "$args:" "${DBG_PADDING:$(((${#args}-1)%${#DBG_PADDING}))}" 
}

1 个答案:

答案 0 :(得分:1)

您必须调用该函数并将脚本args显式传递给它。你可以这样做:

for argz in `echo $*`
do
    dbg ${argz}
done