bash - 无法评估函数的脚本参数

标签 bash parameters arguments bash4

我又开始编写 shell 脚本了,我发现自己经常需要编写调试回显来跟踪脚本正在做什么。我过去用来正确执行此操作的简单方法是编写如下内容:

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

==> myVar:乱七八糟的废话

这很好用而且相当简单,但是,必须为我希望跟踪的每个变量都写这个很累人,作为一个认为用更少的代码做更多的事情很棒的人,我给自己写了一个函数:

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

myVar = 'Erractic Nonesense'
dbg myVar

==> myVar:乱七八糟的废话

这对常规变量非常有用,但对于脚本参数($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}))}" 
}

最佳答案

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

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

关于bash - 无法评估函数的脚本参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19074124/

相关文章:

regex - 如何在第一个大写字符之前创建一个以文件名的一部分命名的文件夹,并将相应的文件移动到新目录中

bash - xargs 不会在 aws cli 输出中的空格上进行分割

java - 真实世界参数优化

objective-c - 定义一个有很多(或无限)参数的方法

bash - 如何找到目录树中的所有符号链接(symbolic link)?

linux - 使用脚本在 bash 中创建文件的多个副本

c# - 第二个参数干扰通用处理程序

javascript - 如何在 URL 中传递值并在新 URL 中插入值以使用 Javascript 进行重定向?

c - 如何使用已经在字符串数组中的名称进行 fopen

c - 使用变量作为函数参数和直接使用字符串作为函数参数有什么区别?