2009年10月1日 星期四

變數值代換(variables substitution)精簡筆記

變數值代換相較於指令代換,是一般使用者比較少碰到的;不過當你要成為一位合格的bash/csh programmer,變數值代換可是要跟吃飯喝水一樣自然。

Case 1. ${variable-'defaultValue'}
意義:當variable不存在時,將variable暫時指定成defaultValue。所謂「暫時」,是指此行之後,在整個script裡variable都還是不存在此變數名稱。

結果:

Maxsolar
       <---沒有輸出
可以發現,第一行的Maxsolar是利用變數值替換得來的,但是事實上我們並沒有真的設定myname,因此echo的結果為無。

Case 2. ${variable:-'defaultValue'}
意義:當variable不存在或為空值時,將variable暫時指定成defaultValue。所謂「暫時」,是指此行之後,在整個script裡variable都還是不存在或變數值不改變。

結果:

Maxsolar
       <---空的輸出
可以發現,由於myname存在但為空值,因此暫時被設定成Maxsolar,但隨即變失去了Maxsolar這個值,因此第一行輸出Maxsolar,第二行的輸出為空值(請注意跟case 1的「沒有輸出」看起來一樣,意義卻不相同)。

Case 3. ${variable:='defaultValue'}
意義:表示variable若不存在或為空值,則指定defaultValue給variable。variable將在整個script裡都為defalutValue。
這是最為常見的變數值替換。

結果:

Maxsolar
Maxsolar
可以發現,由於myname是空值,因此利用":="將myname的值永久設定成Maxsolar(所謂永久,指的是在此script的生命週期裡)。因此兩個輸出都會是Maxsolar。
事實上,在我們的終端機裡控制命令列最前面的 使用者名稱@主機名稱:工作路徑 的這個表示法,就是在~/.bashrc裡利用此變數替換方法來達成的:

Case 4. ${variable:?'defaultValue'}
意義:若variable不存在或為空值,則會出現在std err上,以檢查變數值是否被正確設定。
此變數值替代表示法常用在debug,而不會真正用在可執行的script上,遇到錯誤就會直接停止,無法利用std err導向輸出。

結果:

test.sh: line 32: myname: Maxsolar
因為myname被預期設定值為Maxsolar,但是卻是空值,因此會觸發一個標準錯誤輸出,script嘎然而止。

Case 5. ${variable:+'defaultValue'}
意義:表示variable若已被設定,則本行的variable暫時被設定為defalutValue,但整個script裡的variable未被改變。

結果:

maxubuntu
Maxsolar
可以發現:myname非空值,因此將會被暫時設定成maxubuntu;但是myname的值不會因此改變,仍然是Maxsolar。

好險,變數值的替換就這五種類型,多看個兩次就可以完全懂了。

小節:

  1. 只想測試變數是否為空值:
    可以用"-", ":-"來檢查,且指定的值只有一行的生命。
  2. 若某變數沒有值,就賦值給他:
    可以用":="來指定
  3. 想檢查該變數值是否為某值:
    利用":?"來debug囉!!
  4. 想臨時改變某一個有值的變數:
    利用":+"來賦值。
  5. 想永久改變某一個有值的變數:
    婀,你一定忘記變數值是可以被override的!直接將某變數指定值給他就可以啦!別想太複雜囉!

2009年9月22日 星期二

檢查目錄下的檔案或資料夾數目

這個script,可以幫你檢查當前目錄下,有多少目錄、檔案、隱藏檔以及連結檔。

用法:
只要在該目錄下,直接執行此script即可。

2009年9月15日 星期二

VirtualBox guest OS USB啟用筆記

雖然用了VirtualBox這麼多年,但是卻是頭一次這麼認真的看待這個嚴肅的題目:如何讓guest OS能夠順利讀到USB介面呢?雖然VirtualBox推出新版本的速度非常快,但是至今仍然沒有任何一個版本是可以不用任何設定就可以讓guest直接讀取USB設備的(MacOSX版除外);如果用的是OSE版本,那可是連USB的支援都沒有!!

由於我只有實體的Debian Lenny、Ubuntu 9.04跟OpenSuSE 11.1,因此這裡只紀錄Debian跟OpenSuSE的解決方法。

Debian下非常簡單,首先必須確定你的帳號有在vboxusers裡面。如果沒有的話,請加入到vboxusers裡面,重新登入就可以了。

萬一重新登入還是沒辦法啟用usb,也別著急,只要控制debian下統一控制mount的script就好。首先我們要先找出USB裝置的gid:

cat /etc/group | grep plug
會得到

這個46便是我們所要記下的gid。

接下來請修改/etc/init.d/mountkernfs.sh,找到domount關鍵字,在其下新增一行如下:

domount usbfs usbdevfs /proc/bus/usb -onoexec,nosuid,nodev,devgid=46,devmod=664
請重新開機,不用修改fstab跟usbfs就可以正常使用usb on guest OS。

OpenSuSE則稍微麻煩一點。SuSE系列的linux沒有usb或是plugdev這類的群組,而是全數交由udev統一控管;想要啟用USB on Virtualbox,該怎麼辦呢?
我們檢視一下/etc/udev/rules.d/10-vboxdrv.rules的內容,可以發現要使用virtualbox的usb,得從vboxusers這個群組下手,而非UserManual上所說的usb群組。

cat /etc/group | grep vbox
會得到

可以得知vboxusers的gid是1001,且我是屬於這個群組裡的一員(這很重要)。

請接著修改/etc/fstab,新增一行:

none /proc/bus/usb usbfs devgid=1001,devmode=664 0 0
許多討論串都只說到這裡,但是筆者無論如何嘗試,但是guest OS就是無法存取usb裝置。很幸運的參考了這個討論串,似乎同時是VirtualBox的開發人員consused建議我們可以在加一個NAME參數到/etc/udev/rules.d/10-vboxdrv.rules
KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600" SUBSYSTEM=="usb_device", GROUP="vboxusers", MODE="0664" SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="vboxusers", MODE="0664"
變成
KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600" SUBSYSTEM=="usb_device", GROUP="vboxusers", MODE="0664" SUBSYSTEM=="usb", NAME="vbusb", ENV{DEVTYPE}=="usb_device", GROUP="vboxusers", MODE="0664"

請重新開機!這樣你的Guest OS應該就可以讀得到你的USB裝置了!

2009年8月13日 星期四

JavaScript練習筆記(5)

捕捉異常-- try catch以及throw
如果您熟悉java,一定會對於java嚴謹的try catch控制感到佩服(或是厭煩)。事實上,對於異常的捕捉是非常重要的控制,幸好javascript也沿襲這個優點。

  1. 簡單的try catch

    結果會是:


  2. 多加一點花樣!改用confirm()方法

    結果會是:

  3. 利用document.location.href來指定重新導向的位置。

  4. 拋出自定例外(錯誤)
    在java裡,只有例外(或異常)可以處理,錯誤是無法處理的;在javascript的世界裡,所有的例外都可以處理,而且自訂例外--簡直比喝水還簡單呢!

    結果會是:


    所拋出的是一個例外的字串,而非例外類別。

JavaScript練習筆記(4)

在講到物件之前,我們先從陣列這個重要功能開始講起。

  1. 建立你的第一個array!

    結果會是:


    注意,陣列的index是從0開始算起。


  2. 加強型的for語法:for in

    結果也會是:

    跟Java的foreach語法有些不同,但是用意是類似的。傳統的for可以讓你從陣列中依序、依間隔撈出想要的元素值;而for in(或是foreach)語法雖然比較簡單,但是卻只能「每一個」都取出。


  3. 陣列相加
    JavaScript的陣列相加非常容易,他把陣列當成字串方式來處理!

    結果會是:

    透過concat()方法,javascript會幫我們補上一個","作間隔。


  4. 把陣列轉成字串列印--join()並切割--split()

    結果會是:


  5. 排序陣列元素--sort()並自訂排序方法

    結果會是:


    由此可知,英文字母排序是大寫先排完之後,再排小寫。
    印出陣列時,如果小數點為0則只印出整數部份。
    數字也可以跟字串進行排序,只要符合你自己的規則即可!

卸載檔案系統

很多時候卸載檔案系統會遇到一些困難.
這篇文章提供很詳細的解說, 希望可以幫助解決一些問題!
卸載 (unmount)/退出檔案系統

2009年8月12日 星期三

JavaScript練習筆記(3)

彈出式對話方塊

  1. Confirm Box(確認方塊)

    結果會是:


  2. Alert Box(警告方塊)

    結果會是:

    警告方塊只是一個提醒,沒有更多的互動功能。


  3. Prompt Box(訊息提示方塊)

    結果會是:

    prompt()方法可以接受兩個參數:第一個是「提示方塊的title」,第二個是方塊的預設值。


  4. 方法的應用。談到方法,就不得不提到變數。在方法內宣告的為區域變數,生命有要範圍僅在方法的{ }內;方法外的變數為全域變數,所以方法都可以使用。

    結果會是: