【问题标题】:Cannot evaluate script arguments from function无法从函数评估脚本参数
【发布时间】:2013-10-05 03:07:20
【问题描述】:

我又开始编写 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 的想法,这就是结果。有用。 已更新,请参阅 EDIT 4

编辑 3

我认为 EDIT 2set +-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}))}" 
}

【问题讨论】:

  • 试过这个吗?通过在脚本中添加“set -x”来启用调试 - 打印出所有执行的命令。
  • 函数内部,$1$2等指的是函数的参数,而不是原脚本的参数。
  • 顺便说一句,你不应该使用function XXX { 语法来定义函数,使用标准的XXX() { 语法。
  • 您可以在脚本顶部执行“export MYARGS=$*”来捕获命令行,然后您可以在函数中使用 MYARGS。
  • @MomemtumMori 您可以使用'set +x 再次禁用调试,这样您就可以减少垃圾输出,只调试感兴趣的部分。

标签: bash parameters arguments bash4


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多