2017年11月30日 星期四

Bash Shell | 如何將程序的輸出入結果做為程式參數 Process Substitution

Process Substitution 有兩種使用方式
1. <(list)
   <(list) 整個可以視為一個檔名看待,因此可以當做另一個程式的參數使用,當然也可
   以當作 redirection 使用。想像 list 程式的輸出會存到一個暫存檔,讓另一個程
   式以參數的形式取得暫存檔,並讀取暫存檔的內容。

   使用多個參數的程式可以利用此功能,例如 cmp 會用到兩個參數,當要比較的內容是由
   其它程式的輸出而來,則不用先將其它程式的輸出分別存到暫存檔,再用 cmp 比較暫存
   檔。底下範例用來比較兩個目錄下是否有一樣的檔案名稱,但不支援子目錄的比較。

範例:

#!/bin/sh

mkdir -p folder1
mkdir -p folder2

touch folder1/file1
touch folder2/file2

# Disable POSIX mode because process substitution is not 
# available in POSIX mode
set +o posix

if cmp -s <(ls folder1) <(ls folder2); then
        echo "folder1 and folder2 are the same."
else
        echo "folder1 and folder2 are different."
fi

touch folder1/file2
touch folder2/file1

if cmp -s <(ls folder1) <(ls folder2); then
        echo "folder1 and folder2 are the same."
else
        echo "folder1 and folder2 are different."
fi

結果:

folder1 and folder2 are different.
folder1 and folder2 are the same.

2. >(list)
   >(list) 整個可以視為一個檔名看待,因此可以當做另一個程式的參數使用,當然也可
   以當作 redirection 使用,想像有一個暫存檔當做 list 程式的輸入,另一個程式
   以參數的形式取得暫存檔,對暫存檔的輸出都變成 list 程式的輸入。

Bash Shell | 如何使用內建指令 type Command

type 指令可以用來查詢某個指令的型態,可能的型態如下
1. 別名 (alias)
2. 函式 (function)
3. 內建指令 (builtin)
4. 檔案 (file)
5. 關鍵字 (keyword)

在終端機下執行底下指令,此範例執行 type 指令並傳入五個參數


範例:


type ls command_not_found_handle source cp if


結果:


ls is aliased to `ls --color=auto'

command_not_found_handle is a function
command_not_found_handle () 

    runcnf=1;
    retval=127;
    [ ! -S /var/run/dbus/system_bus_socket ] && runcnf=0;
    [ ! -x /usr/libexec/packagekitd ] && runcnf=0;
    if [ $runcnf -eq 1 ]; then
        /usr/libexec/pk-command-not-found $1;
        retval=$?;
    else
        echo "bash: $1: command not found";
    fi;
    return $retval
}
source is a shell builtin
cp is /bin/cp
if is a shell keyword

說明:


1. ls 是一個別名 (alias),也可以透過 alias 指令來查詢所有的別名。

2. command_not_found_handle 是一個函式 (function),也可以透過 set 看到函式原型
3. source 是 bash 的一個內建指令 builtin
4. cp 是一個檔案 (file),位置在 /bin 目錄底下
5. if 是一個 bash 的關鍵字 (keyword)

好站連結
1. http://linux.vbird.org/linux_basic/0320bash.php#bash_type

2017年11月23日 星期四

Bash Shell | 如何使用條件式指令 select Command

select 命令的語法如下

select name [in words …]; do commands; done


select 命令可以用來產生選單,底下是一個能夠自動產生兩個數字相加的練習程式,數字由 $RANDOM 產生,使用 $PS3 可以設定 select 命令的提示訊息,使用者選擇後 name 會是被選到之選項的值,而 $REPLY 是被選到之選項的代號,當使用者輸入超過選項的代號時,name 會是空字串。


範例:


#!/bin/sh


value1=$((RANDOM%100))

value2=$((RANDOM%100))

equation="$value1 + $value2"


# PS3 is the prompt message

PS3="What is the answer of ( $equation )? "

ans=$(($equation))


order=$((RANDOM%4))


# ans_list contains the items within the menu

for ((i=0; i<4; i++))
do
        if [ "$i" -eq "$order" ]; then
                ans_list="$ans_list $ans"
        else
                ans_list="$ans_list $((RANDOM%200))"
        fi
done

select answer in $ans_list;

do
        # answer will be empty if the selection is out of range.
        if [ -n "$answer" ]; then
                echo You selected the answer $REPLY\).
                if [ "$(($equation))" -eq "$answer" ]; then
                        echo Great, \"$answer\" is correct.
                        break;
                fi
                echo \"$answer\" is incorrect.
                echo Calculate again.
        else
                echo NOTICE: Please select between 1 to 4.
        fi
done

結果:

1) 121
2) 106
3) 17
4) 128
What is the answer of ( 7 + 10 )? 1
You selected the answer 1).
"121" is incorrect.
Calculate again.
What is the answer of ( 7 + 10 )? 3
You selected the answer 3).
Great, "17" is correct.

2017年11月20日 星期一

Bash Shell | 如何做算術運算 Shell Arithmetic

想要在 bash 做算術運算,並保留運算後的值,有三種方式
1. Arithmetic expansion

    $(( expression ))


範例:


#!/bin/sh


var1=1

echo Before arithmetic expansion \$var1 = $var1
var1=$(( var1 + 1 ))
echo After arithmetic expansion \$var1 = $var1
     
結果:

Before arithmetic expansion $var1 = 1

After arithmetic expansion $var1 = 2

說明:


因為 var1 不是宣告成整數型態,因此用 $(( )) 讓 bash 知道是要做算術運算


2. 使用 declare -i 將變數宣告為整數型態


範例:


#!/bin/sh


declare -i var2=1

echo Before arithmetic evaluation \$var2 = $var2
var2=var2+1
echo After arithmetic evaluation \$var2 = $var2

結果:


Before arithmetic evaluation $var2 = 1

After arithmetic evaluation $var2 = 2

說明:

因為 var2 是被宣告成整數型態,因此可以直接做算術運算


3. 使用 Conditional Constructs


    (( expression ))


範例:


#!/bin/sh


var3=1

echo Before arithmetic expression \$var3 = $var3
(( var3 += 1 ))
echo After arithmetic expression \$var3 = $var3

var4=1
echo Before arithmetic expression \$var4 = $var4
(( var4=var4+1 ))
echo After arithmetic expression \$var4 = $var4


結果:

Before arithmetic expression $var3 = 1

After arithmetic expression $var3 = 2
Before arithmetic expression $var4 = 1


After arithmetic expression $var4 = 2

說明:

原本 (( expression )) 的用法應該是將 expression 的運算結果做為條件式判斷的依據,因為 expression 運算的結果如果非0,則 (( expression )) 會回傳 0,不然則回傳 1,但是利用了如 +=, -=, ++, -- 等運算子會修改變數的特性來達到同上面一樣的效果,或是用 = 將運算結果設定給變數。

範例:

#!/bin/sh

(( 1 + 1 ))
echo $?

(( 1 - 1 ))
echo $?

var4=(( 1 + 1 ))

結果:

0
1
./arithmetic.sh: line 30: syntax error near unexpected token `('
./arithmetic.sh: line 30: `var4=(( 1 + 1 ))'

好站連結
1. http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#ex_cal

2017年11月18日 星期六

Bash Shell | 如何使用條件式指令 if Command

if 命令的語法如下

if test-commands; then

  consequent-commands;
[elif more-test-commands; then
  more-consequents;]
[else alternate-consequents;]
fi

要注意的重點有兩個

1. if 判斷的是命令執行後的離開狀態 (exit status) 而不是命令的標準輸出 stdout
2. 因為離開狀態 (exit status) 為 0 表示成功,所以當 test-commands 的離開狀態為 0 時,if 會執行 consequent-commands。與 C 語言不同,C 語言是當 test-commands 為非 0 值時會執行 consequent-commands

if 命令的官方資訊


範例:


#!/bin/sh

if declare -p var1 &>/dev/null; then

    echo "The exit status of declare is $?"
    echo "var1 is set"
else
    echo "The exit status of declare is $?"
    echo "var1 is unset"
fi

var1=

if declare -p var1 &>/dev/null; then
    echo "The exit status of declare is $?"
    echo "var1 is set"
else
    echo "The exit status of declare is $?"
    echo "var1 is unset"
fi
     
結果:

The exit status of declare is 1
var1 is unset
The exit status of declare is 0
var1 is set

好站連結
1. http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#ifthen

Bash Shell | 如何使用單一指令 Simple Command

Bash 最常用到的就是 Simple Command,包含命令名稱與命令的參數。

範例:

echo These are arguments of echo

說明:

echo 是一個 simple command
These are arguments of echo
因為沒有用雙引號括起來,每個字都是 echo 的參數,共有 5 個參數

命令執行結束還會有離開狀態 (exit status),可以根據離開狀態 (exit status) 做為接下來要執行指令的判斷依據。離開狀態 (exit status) 的原則是,當離開狀(exit status) 為 0 時表示執行成功,非 0 表示失敗。離開狀態的範圍從 0 到 255,可以在 Simple Command 執行後從變數 $? 取得 Simple Command 的離開狀態 (exit status)。

注意因為每個 command 執行後都有離開狀態 (exit status),表示 $? 在每個指令執行後都會改變,如要取得特定指令的離開狀態 (exit status),必須在特定指令後立即參考 $?

官方離開狀態 (exit status) 資訊

範例:

#!/bin/sh

function IS_VAR_SET()
{
    if declare -p $1 &> /dev/null; then
        echo "$1 is set"
    else
        echo "$1 is unset"
    fi
}

declare -p var1 &>/dev/null
echo "The exit status of 'declare -p var1' is $?"
IS_VAR_SET var1

echo "set var1"
var1=
declare -p var1 &>/dev/null
echo "The exit status of 'declare -p var1' is $?"
IS_VAR_SET var1

結果:

The exit status of 'declare -p var1' is 1
var1 is unset
set var1
The exit status of 'declare -p var1' is 0
var1 is set

說明:

使用 declare -p 來判斷變數是 set 或 unset,從範例結果可知,當變數是 set,
declare -p 的離開狀態 (exit status) 是 0,而 unset 時是 1。

2017年11月15日 星期三

Bash Shell | 如何開啟或關閉 POSIX 模式 POSIX mode

在看 bash manual 時,常會看到 POSIX mode,如果要確認是否在 POSIX mode 可以透過底下指令,其它 options (例如:history, noclobber, pipefail 等) 也可使用此指令控制。

POSIX mode 相關資訊


如果要看全部的 options 可以使用 set -o


範例:


#!/bin/sh

set -o


結果:


allexport      off
braceexpand    on
emacs          on
errexit        off
errtrace        off
functrace      off
hashall        on
histexpand      on
history        on
ignoreeof      off
interactive-comments on
keyword        off
monitor        on
noclobber      off
noexec          off
noglob          off
nolog          off
notify          off
nounset        off
onecmd          off
physical        off
pipefail        off
posix          off
privileged      off
verbose        off
vi              off
xtrace          off

想要單獨看 posix 則使用 grep 取出,如下範例

範例:
        
#!/bin/sh

set -o | grep posix


結果:


posix           on

如果要設定 posix 為 off 可以使用 set +o posix

範例:


#!/bin/sh

set -o | grep posix

set +o posix
set -o | grep posix

結果:


posix           on
posix           off

如果要設定 posix 為 on 可以使用 set -o posix


範例:


#!/bin/sh

set -o | grep posix

set +o posix
set -o | grep posix
set -o posix
set -o | grep posix

結果:

posix           on
posix           off
posix           on

2017年11月13日 星期一

Bash Shell | 如何使用條件式指令 case Command

case 命令的語法如下

case word in [ [(] pattern [| pattern]…) command-list ;;]… esac

一個 [ [(] pattern [| pattern]…) command-list ;;] 稱為一個 clause,因此
case word inesac 之間可以有多個 clause,底下範例假設 clause 數量大於0。

範例:

case word in
    [(] pattern [| pattern]…) command-list ;;
    [(] pattern [| pattern]…) command-list ;;
    ....
esac

[(] 可以不加,所以可以簡化成如下形式

範例:

case word in
    pattern [| pattern]…) command-list ;;
    pattern [| pattern]…) command-list ;;
    ....
esac

如果一個 clause 只有一個 pattern,則可以簡化成如下形式

範例:

case word in
    pattern ) command-list ;;
    pattern ) command-list ;;
    ....
esac

如果有 clause 有兩個 pattern,可以寫成如下第一個 clause 的型式

範例:
        
case word in
    pattern |  pattern ) command-list ;;
    pattern ) command-list ;;
    ....
esac

;; 可以替換成底下兩種,結果不同
1. ;&  如果此 clause 的 pattern 發生 match,則下一個 clause 的 command-list 也會被執行。

2. ;;& 如果此 clause 的 pattern 發生 match,則會往下找出所有 match 的 clause,並執行對應的 command-list。

底下範例,當輸入 one 或 two 則會連 three 那行 clause 的 command-list 也執行。當輸入 four 則會往下找所有的 clause,最後發現 *) 這個 clause 也 match,因此執行對應的 command-list。

範例:
        
#!/bin/sh

read -p "Please input a number in English (ex: one):"

var1=$REPLY

case $var1 in
    one | two ) echo "one | two) \$var1 = $var1 ;&" ;&
    three ) echo "three ) \$var1 = $var1 ;;" ;;
    four ) echo "four ) \$var1 = $var1 ;;&" ;;&
    five ) echo "five ) \$var1 = $var1 ;;" ;;
    * ) echo "*) \$var1 = $var1 ;;" ;;
esac

結果:

[william@william-fedora test]$ ./case.sh 
Please input a number in English (ex: one):one
one | two) $var1 = one ;&
three ) $var1 = one ;;

[william@william-fedora test]$ ./case.sh 
Please input a number in English (ex: one):two
one | two) $var1 = two ;&
three ) $var1 = two ;;

[william@william-fedora test]$ ./case.sh 
Please input a number in English (ex: one):three
three ) $var1 = three ;;

[william@william-fedora test]$ ./case.sh 
Please input a number in English (ex: one):four
four ) $var1 = four ;;&
*) $var1 = four ;;

[william@william-fedora test]$ ./case.sh
Please input a number in English (ex: one):five
five ) $var1 = five ;;

[william@william-fedora test]$ ./case.sh
Please input a number in English (ex: one):six

2017年11月11日 星期六

台北冰宮場地介紹/入場費用/裝備租借/營業時間/經驗分享,喜歡冰刀的朋友一定要來試試

最後更新日期:2022/02/02
以下分享的資訊僅供參考,最新資訊請以官方網頁為準

1. 小巨蛋冰上樂園
營業時間:
        每週一至週五:10:00~21:00
        週六、週日、其他國定假日及寒暑假:09:00~21:00
        (開放時間結束前30分鐘停止售票)

        另外特別注意暫停營業訊息


交通方式:
        臺北市松山區南京東路4段2號

        可搭乘捷運「松山新店線(3號線)」至台北小巨蛋站後,2號出口即達。

        完整官方交通資訊

收費標準:
門票     
        平日200元/2小時
        假日220元/2小時

裝備   
        冰鞋租用 80元/每次
        護具租用(安全帽/護膝/護腕/護肘) 各20元/每次 全套租用為50元。
        手套自備或現場櫃檯購買50元(可帶回家)

        完全不準備裝備               
        平日共  380元/2小時
        假日共  400元/2小時

        自備手套
        平日共  330元/2小時
        假日共  350元/2小時

        自備整套護具與手套
        平日共  280元/2小時
        假日共  300元/2小時


        完整官方收費資訊








































經驗分享:

1. 夏天周末溜冰的人較多,可以提前先去抽號碼,如果發生過號,櫃檯說可以幫忙安排入場。

2. 固定的冰面整理時間是20分鐘,整理期間無法溜冰,時間如下(冰面整理官網資訊),雖然碰到冰面整理時,時間會補償,但是建議是盡量在冰面整理後入場,如果在冰面整理前入場,就會遇到兩次冰面整理,有點浪費時間。


例如:11:50入場,12:00冰面整理到12:20,所以可以溜到14:10,但是因為14:00到14:20又冰面整理,所以變成溜到14:30,會等到兩次冰面整理。


每週一至週五:14:00~14:20、18:00~18:20

週六、週日、其他國定假日及寒暑假:12:00~12:20、14:00~14:20、16:00~16:20、18:00~18:20

3. 如果忘記出場時間,可以把磁卡帶到領裝備處,請櫃台人員幫忙查詢。


4. 新手可以先看冰宮提供的影片,學習如何穿戴護具與當在冰上摔倒時如何應對,影片現場也會撥放。


5. 建議穿長襪,避免冰鞋一直摩擦小腿造成不適。


6. 其他疑問可以參考冰宮的常見問答



捷運小巨蛋二號出口往上走到平面後,往左可以看到小巨蛋場館

































往小巨蛋場館前進,從北區4號入口進入






























從入口進入後往左看,有一個樓梯到二樓,上到二樓後左轉,可以到小巨蛋冰宮





























如果冰宮櫃台旁的座位都滿了,暫坐在樓梯附近時,樓梯二樓的右上方牆上有顯示目前叫到幾號






























一通過自動門進入冰宮後,前方會馬上看到取票機,請馬上取票







































接下來利用取號機附近柱子旁地面會有量鞋號的木板,確認自已冰鞋的尺寸,腳底版寬的人,建議選比量出來的尺寸大一號至兩號(個人經驗),購票時會詢問你尺寸,領鞋子後如果尺寸不合可以到領奘備處換







































至櫃檯購票後會得到磁卡發票,等下會用發票領裝備,然後從櫃台旁的入口處用磁卡入場,磁卡出場會用到,請保管好下圖是在櫃檯購買的手套


























































從入口處進入後左轉,會看到領裝備的櫃檯,用發票領裝備





新手請先在溜冰場右側區塊練習,就是照片中地面上一長排藍色障礙物的右側














出場時要先到領裝備的櫃台旁將磁卡消磁才能夠出場













































































2. 土城運動中心冰宮 FB
營業時間:
        10:00 - 20:00

        底下是取自官方網站,關於土城國民運動中心營業的資訊

        問:請問場館有「休館日」嗎?「營業時間」是幾點呢?
        答:
        (1) 本中心除了「農曆春節除夕、初一」休館外,其餘皆有營業。
            ※ 若遇新北市政府公佈停班停課,全館也會休館不營業。

        (2) 正常營業時間為 06:00-22:00

            春節初二至初五則調整營業時間為08:00-17:00

        完整官方資訊

交通方式:
        新北市土城區金城路二段247-1號

        捷運板南線海山站下車,3號裕民路出口出站,至裕民路後,轉搭藍41公車
至廣川醫院,下車步行約3分鐘抵達。

        完整官方交通資訊


收費標準:
       底下資訊取自官方網站
       【入場票價 - 可使用3小時加贈1小時(含緩衝、穿脫護具、洗冰時間)】
       ● 全 票:180元 / dult:NT$180
       ● 學生票:120元 / Student:NT$120
       ● 參觀票:30元 / Visit the ticket:NT$30
       【裝備費用】
       ● 手套購買:30元 Gloves:NT$30
       ● 冰鞋租用:50元/次 Skating Boots:NT$50/time
       ● 單項護具租用:20元/次 Single Item:NT$20/time
       ● 全套護具租借(含護膝、護掌、護肘):50/次 Full Set:NT$50/time
       ● 安全帽租用:20元/次 Helmet:NT$20/time


       一般人的費用如下,底下裝備也可以自備,手套是買斷,未來都可以用

       全票 180 + 手套 30 + 冰鞋 50 + 全套護具 50 + 安全帽 20 = 330/3小時
       完整官方收費資訊 

       注意:點開官方收費資訊連結後,網頁內容出現B1/停車場,請將左方下拉選單從B1改成3F,接著下方選冰宮 ICE RINk可以看到收費資訊

心得分享:

  1. 雖然土城的溜冰場比小巨蛋的小,但是價錢較便宜,以假日來說,小巨蛋400元溜2小時,土城330元就可以溜3小時,還加贈一小時做為穿戴護具與洗冰用,適合需要多一些時間練習的人。
  2. 騎機車的人停車挺方便,金城路二段入口的機車停車位不少,如果是選擇從學府路進到土城運動中心,在運動中心的背面也會看到一些機車停車位。

金城路二段的入口,從這裡進去路旁都是機車停車位




























再往內走,可以看到土城運動中心的地下汽車停車場




























土城運動中心正門有三個門,可以走左右兩個門進入
















進入後會看到櫃台,請排隊買冰宮的票與裝備




























買完票後會取得冰宮計時卡(一人一張)與一張發票發票上會標註有幾雙冰鞋與哪些裝備,發票用來在三樓冰宮入口的櫃台領冰鞋與裝備,請保管好




























購票櫃檯左邊有螢幕顯示目前冰宮的人數




























購票完成後,直接左轉往前直走可以看到電梯的指示牌










































































電梯的對面就是樓梯





































到達三樓冰宮的入口,請先去量冰鞋尺寸,在紅色框起來的廣告看板後面










































































土城冰宮只有提供偶數尺寸的冰鞋腳底板寬的人建議穿比測量的號碼更大的冰鞋,因為只有偶數尺寸,如果測量是8號的人就只能選穿10號,尺寸不適合再跟領鞋櫃台換(不出閘門,在閘門內跟領鞋櫃檯說要換鞋)

另外,冰宮入口的右邊是茶水間,可以補充水瓶的水





































測量完後就以發票跟右邊的櫃台領冰鞋裝備,領完後用冰宮計時卡進入閘門,進入閘門後右側有廁所,閘門正中央有一個紅色的告示牌,意思只要離場就要重新購票,請注意




























冰鞋





































安全帽




























進入閘門後的下一個門就可以看到溜冰場,觀眾席旁有飲料零食販賣機置物櫃












這張是從觀眾席角度拍溜冰場,溜冰場的入口在照片左側,溜冰場的右側是練習區,離開時只要用冰宮計時卡通過進來的閘門,將冰鞋與裝備還給領鞋櫃台即可。










溜冰場的場地使用示意圖可以參考下圖





































3. 中國信託金融園區戶外滑冰場

開放時間/時段:

    110/12/09 ~ 111/03/06 (111/01/31 除夕休館一天)
    











圖片取自 https://www.ctbcfinancialpark.com/activity/Detail/102?category=2

更多細節