2013-09-29 45 views
4

我已經開始編寫shell腳本了,我發現自己經常需要編寫debug echo來跟蹤腳本正在做什麼。的,簡單的,方法我以前做的這項權利是寫這樣的:無法評估函數的腳本參數

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

==>myVar: Erractic Nonesense

這偉大的工作,是相當簡單的,但是,有寫這爲每個變量我希望追查是很累,因爲誰認爲有更少的代碼做更多的東西是偉大的人,我寫我自己的函數:

#!/bin/bash 
dbg() # $msg 
{ 
    echo "[email protected]: ${[email protected]}" 
} 

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我現在明白爲什麼它的行爲這樣,但是,第二個問題依然存在。

EDIT 2

使用koodawg的想法,這就是結果。有用。 更新,請參閱編輯4

編輯3

我認爲EDIT 2set +-x的組合將是一個可行的解決方案。

EDIT 4

更新邏輯落在參數與前一個並不總是奏效。添加了花哨的標籤。

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

試過嗎?通過在腳本中放置'set -x'來啓用調試 - 將所有命令輸出爲已執行。 –

+0

哦。謝謝你提醒我存在!現在唯一的問題是閱讀它輸出的巨大混亂......我仍然好奇爲什麼我的功能不起作用。 – gxtaillon

+5

在函數內部,'$ 1','$ 2'等引用函數的參數,而不是原始腳本的參數。 – Barmar

回答

1

您將不得不調用該函數並明確地將腳本參數傳遞給它。你可以這樣做:

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