我又开始编写 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 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}))}"
}
最佳答案
您必须调用该函数并将脚本参数显式传递给它。你可以这样做:
for argz in `echo $*`
do
dbg ${argz}
done
关于bash - 无法评估函数的脚本参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19074124/