4

私は再びシェル スクリプトを書き始めましたが、スクリプトが何を行っているかを追跡するためにデバッグ エコーを頻繁に書かなければならない状況に陥っています。私がこれを正しく行うための簡単な方法は、次のようなものを書くことでした:

#!/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 番目の疑問が残ります。

編集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}))}" 
}
4

1 に答える 1

1

関数を呼び出して、スクリプト引数を明示的に渡す必要があります。次のようなことができます:

for argz in `echo $*`
do
    dbg ${argz}
done
于 2013-10-04T18:37:30.060 に答える