2013年5月24日 星期五

Bash/Dash Shell Script 當中的邏輯判斷

首先是函式的例子:
#!/bin/sh

yes_func()
{
    echo yes_func
    true
}

no_func()
{
    echo no_func
    false
}
                                
if ! yes_func || yes_func; then
    echo two yes_func
fi

if ! no_func && ! no_func; then
    echo two no_func
fi

驚歎號 '!' 是真假值反相的運算,要與函式名稱之間用空白隔開,否則會成為函式名稱的一部份。

另外就是「且」邏輯運算 '&&' 與「或」邏輯運算 '||' 的執行優先序都比反相邏輯運算 '!' 還要低。

接下來是數值的例子:
#!/bin/sh

NUM=5

if [ $NUM -eq 5 ]; then
    echo "#$NUM == 5"
else
    echo "#$NUM != 5"
fi

if [ $NUM -ne 5 ]; then
    echo "#$NUM != 5"
else
    echo "#$NUM == 5"                     
fi

if [ $NUM -gt 0 -a $NUM -lt 10 ]; then
    echo "0 < #$NUM < 10"
fi

NUM=11

if [ ! $NUM -gt 0 -o ! $NUM -lt 10 ]; then
    echo "#$NUM <= 0 or #$NUM >= 10"
fi

if [ $NUM -le 0 -o $NUM -ge 10 ]; then
    echo "#$NUM <= 0 or #$NUM >= 10"
fi

if [ ! $NUM -lt 0 -a $NUM -gt 10 ]; then
    echo "#$NUM >= 0 and #$NUM > 10"
fi

if [ $NUM -ge 0 -a $NUM -gt 10 ]; then
    echo "#$NUM >= 0 and #$NUM > 10"
fi

數值的算數運算子有:

  • '-eq' 等於 '=='
  • '-ne' 不等於 '!='
  • '-lt' 小於 '<'
  • '-gt' 大於 '>'
  • '-le' 小於或等於 '<='
  • '-ge' 大於或等於 '>='

而 '-a' 相當於前面提過的「且」邏輯運算 '&&','-o' 則是相當於「或」邏輯運算 '||',同樣地優先序都比反相邏輯運算 '!' 還要低。

最後是是否為空字串的例子:
#!/bin/sh

STR1="foo"
STR2=""

if [ ! -z "$STR1" -a -z "$STR2" ]; then
    echo "'$STR1' is not empty, and '$STR2' is empty."
fi

if [ -n "$STR1" -a -z "$STR2" ]; then
    echo "'$STR1' is not empty, and '$STR2' is empty."
fi

if [ -z "$STR1" -o -z "$STR2" ]; then
    echo "'$STR1' is empty, or '$STR2' is empty."
fi

STR1="foo"
STR2="bar"

if [ ! -z "$STR1" -a ! -z "$STR2" ]; then
    echo "'$STR1' is not empty, and '$STR2' is not empty."
fi

STR1=""
STR2=""

if ! [ -n "$STR1" -o -n "$STR2" ]; then
    echo "'$STR1' is empty, and '$STR2' is empty."
fi

if [ -z "$STR1" -a -z "$STR2" ]; then
    echo "'$STR1' is empty, and '$STR2' is empty."
fi                                                        

'-z' 是否為空字串的運算子,'-n' 是否為非空字串的運算子。

跟前面的數值運算一樣都需要用中括號包起來使用,另外就是反相邏輯運算 '!' 可以直接使用在中括號的運算結果。

2013年5月13日 星期一

自製 Ubuntu 13.04/12.10/12.04.2 與 Debian 7.0 測試硬體安裝使用的 USB 隨身碟

為了同時可以在 Legacy BIOS 與 UEFI BIOS 上使用的,首先使用 Ubuntu 12.04.2 以上內建的 usb-creator-gtk 工具來產生一個 Ubuntu 13.04 desktop amd64 的 USB 隨身碟來用。

$ usb-creator-gtk -n -i ubuntu-13.04-desktop-amd64.iso

接下來的動作,只要使用 Ubuntu 13.04 的 Live System (amd64) 就可以了,不用安裝到硬碟上面。

進入 Ubuntu 13.04 Live System (amd64) 之後,執行以下指令。

ubuntu@ubuntu:~$ sudo apt-get install grub-pc-bin grub-efi-amd64-bin                                                                                                                                       
正在讀取套件清單... 完成
正在重建相依關係
正在讀取狀態資料... 完成
grub-pc-bin 已經是最新版本了。
下列【新】套件將會被安裝:
  efibootmgr grub-efi-amd64-bin
升級 0 個,新安裝 2 個,移除 0 個,有 0 個未被升級。
需要下載 0 B/581 kB 的套件檔。
此操作完成之後,會多佔用 2,316 kB 的磁碟空間。
選取了原先未選的套件 efibootmgr。
(讀取資料庫 ... 目前共安裝了 161462 個檔案和目錄。)
解開 efibootmgr(從 .../efibootmgr_0.5.4-4ubuntu1_amd64.deb)...
選取了原先未選的套件 grub-efi-amd64-bin。
解開 grub-efi-amd64-bin(從 .../grub-efi-amd64-bin_2.00-13ubuntu3_amd64.deb)...
執行 man-db 的觸發程式 ...
設定 efibootmgr (0.5.4-4ubuntu1) ...
設定 grub-efi-amd64-bin (2.00-13ubuntu3) ...

將另外一隻 USB 隨身碟插入 USB 埠,執行以下指令。

ubuntu@ubuntu:~$ sudo grub-install --removable --target=i386-pc --root-directory=/media/ubuntu/UsbStick/ /dev/sdc
Installation finished. No error reported.
ubuntu@ubuntu:~$ sudo grub-install --removable --target=x86_64-efi --root-directory=/media/ubuntu/UsbStick/ /dev/sdc
/usr/sbin/grub-probe: error: failed to get canonical path of /cow.
Installation finished. No error reported.

請將以上的 /dev/sdc 與 /media/ubuntu/UsbStick/ 代換成符合實際使用環境上的字串。

接下來將 grub.cfg 放到 /media/ubuntu/UsbStick/boot/grub/ 底下。

最後再將相對應的 ISO 檔案都放到 /media/ubuntu/UsbStick/iso/ 底下就可以了。

之後只要針對 grub.cfg 的內容做調整加入需要的選項即可。

這樣一來就可以在安裝前先測試看看硬體的相容性,再來決定要不要安裝到硬碟裡面。

P.S. Ubuntu 上面有些無線網路的驅動程式是要安裝到硬碟裡面重新啟動才會正常運作的。