返回列表 發帖

對script做debug花了我三天

最近看鳥哥的教學文件,在寫簡單的script
http://linux.vbird.org/linux_basic/0340bashshell-scripts.php
練習題也都有做,讓我想起國中時自修basic的惡夢。但我這次是真的比國中時要更認真了。不過整個寫作過程中,我遇到最大的問題就是「很難找到正確解答」,因為整個寫作邏輯就不一樣,所以script的長相差了10萬8千里,如果正確執行也就算了,如果執行錯誤,和鳥哥的解答根本無從比較起("There's more than one way to do it."的後果)。下面就是我本週遇到的噩夢。題目是第二練習題,要求寫出能夠算出生日還有幾天的script。
read -p "please input your birthday (mmdd): " birthday
if [ "$birthday" -eq $(date +%m%d)]; then
        echo "today is the birthday of shit!"

elif [ "$birthday" -lt $(date +%m%d) ]; then
        echo $
        (
                (
                        (
                                $(
                                        date +%s $(date +%Y)$(date +%m%d)
                                ) -
                                $(
                                        date +%s $(date +%Y+1)$(date $birthday)
                                )
                        )/86400
                )
        ) "days remain"
       
elif [ "$birthday" -gt $(date +%m%d) ]; then
        echo $
        (
                (
                        (
                                $(
                                        date +%s $(date +%Y)$(date +%m%d)
                                ) -
                                $(
                                        date +%s $(date +%Y)$(date $birthday)
                                )
                        )/86400
                )
        ) "days remain"
fi

一直收到無法配對、EOF什麼的,問題是出現錯誤的幾行我怎麼看都找不到問題,甚至明明只有25行,卻和我說26行有問題的鳥狀況。我很想PO到linux專版去問人,但很怕程度太差被打槍,我研究三四天後,昨晚才完全搞定,沒PO去問人是正確的,因為真的錯得很誇張。
那個配對問題是出在第一個echo的引號,前面有加但後面沒有,所以bash就一路找到最後,跟我說最後沒有配對的引號,所以我一直在後面找也沒用。
再來,我沒搞懂數學運算的表示法,一直很想把$(())改成類似`()`或是其他的表示法,date的語法也是亂七八糟,如果要指定特定日期,+%s要擺在後面,前面要加-d,另外雖然我把語法修正,卻發生日期變負數,或是時間越近,等待越久的異常狀況,很明顯算式有問題。(好像不只這些問題,懶得想了XD)

read -p "please input your birthday (mmdd): " birthday
if [ "$birthday" -eq $(date +%m%d) ]; then
        echo today is your birthday!&&exit 0

elif [ "$birthday" -lt $(date +%m%d) ]; then
        echo $((
                                (
                                $(date -d $((`date +%Y`+1))$(echo $birthday) +%s)
                                 -
                                $(date -d $(date +%Y)$(date +%m%d) +%s)
                                )/86400
                )) days remain&&exit 0

elif [ "$birthday" -gt $(date +%m%d) ]; then
        echo $((
                                (
                                $(date -d $(date +%Y)$(echo $birthday) +%s)
                                 -
                                $(date -d $(date +%Y)$(date +%m%d) +%s)
                                )/86400
                )) days remain&&exit 0
else
        echo error
fi
echo "test end"

這是最後弄好的,可以正確執行,總之debug這種事,不管是電腦語言還是數學證明題,真的會讓人傷透腦筋啊!!!

真的~~~這種東西寫到後來寫得順利就會很高興,一出錯就會開始頭痛
話說這真的只能多練習而已,也沒有啥快速的捷徑,
記得我一開始學的時候,我還想偷懶參考別人的寫法
我老闆居然回我一句~~你找的到嗎.....
之後就乖乖的自己想自己寫了

TOP

幹這種活在卡關時會很苦惱
一通關就有無比的快樂

TOP

但是苦惱的時候會心情暴躁
之前我寫JSP網站的時候也是XD

TOP

自修的話我會比較傾向從需求來練習
因為寫習題雖然也能達到目的
但真的要用時又要再試一次
還不如等到要用時嘗試兼練習

看別人的東西是有用的
只是要選對參考目標, 而且很花時間
當年追 gtk+directfb 花了四個月, 每天 10-23
可是一但打通了
自己寫的時候就比較不會出錯
由於大專案都有相似的寫作風格
看通一個大案子, 想了解別的案子速度會加快很多
如果選正確對象, 我認為多看別人的東西是很有意義的

TOP

自修的話我會比較傾向從需求來練習
因為寫習題雖然也能達到目的
但真的要用時又要再試一次
還不如等到要用 ...
WuKC 發表於 2011-7-16 15:11

這點我很認同,我去年一開始看了半年的教學(read only),結果等linux系統灌好後的前兩個星期學到的遠比那半年多
但反過來說,等到要用的時候往往會來不及學 加上因為對linux不了解,也就不會想讓linux做什麼事 (或是根本不曉得能做什麼),結果惡性循環就來了。

勉強要說嘛!現在就好像在背單字和注意文法那樣,算是之後和老外對話先鋪個路而已。

話說........我目前的練習,大部分會用到簡單的互動對話,不過實際上我裡面回應都寫髒話,算是辛苦中的小娛樂,尤其對於"假設使用者打錯"時的回應,每次測試時都會一直笑。

TOP

回覆 6# LIAR
>但反過來說,等到要用的時候往往會來不及學
這就要看人了
像我就是那種學了沒馬上用就馬上忘掉的XD
所以一定是要用才學

>每次測試時都會一直笑。
這是很正常的
不過如果要賣的東西就要養成好習慣不要搞這
以前有個新聞, 非常久了, 不太記得
好像是微軟還蘋果? 在 code 裡加了測試用後門
啟動條件就是輸入對手公司的工程師是小香腸這句話就通過
玩得很 high, 然後被抓到XD
有沒有被告不清楚, 不過下場不太好就是了XD
所以現在流行寫在註解然後open source(?)XD

TOP

>不過如果要賣的東西就要養成好習慣不要搞這
>以前有個新聞, 非常久了, 不太記得
>好像是微軟還蘋果? 在 code 裡加了測試用後門

我之前想丟上來,或是想拿去問人時,就感受到這玩笑的風險了

記得微軟office也有不少梗,但都是玩自己或BILL,玩到別人身上就自爆囉!

TOP

題外話亂入。

當初好像有看到別人轉錄了一段話:「如果你想浪費一個人一下午的時間,給他一個程式。如果你要浪費一個人一輩子的時間,教他寫程式」

TOP

返回列表