2017年10月26日 星期四

『Bash Shell』如何使用陣列 Array (索引式 Indexed /關聯式 Associative) 程式範例/完整說明

Bash 支援兩種陣列 (Array) 的型態
1. Indexed array
2. Associative array


第一種 Indexed array 是以數字做陣列的索引,從 0 開始


範例:

#!/bin/sh

# 底下有兩種指定陣列成員的方式
# 選一種使用

#
# 方式一
#
HTC_phone_list[0]="HTC U11"
HTC_phone_list[1]="HTC U Ultra"
HTC_phone_list[2]="HTC U Play"
HTC_phone_list[3]="HTC One A9s"

#
# 方式二
#
HTC_phone_list=("HTC U11" "HTC U Ultra" "HTC U Play" "HTC One A9s")

#
# 印出陣列中的成員
#
# ${#HTC_phone_list[@]}: 加上 "#" 表示陣列的長度
#
for((i=0; i<${#HTC_phone_list[@]}; i++))
do
        echo ${HTC_phone_list[i]}
done


第二種 Associative array 是以字串做陣列的索引


範例:

#!/bin/sh

# 底下有兩種指定陣列成員的方式
# 選一種使用
# 注意: 請勿省略 declare -A

#
# 方式一
#
declare -A Score
Score[bob]=85
Score[john]=70
Score[andy]=90

#
# 方式二
#
declare -A Score=([bob]=85 [john]=70 [andy]=90)

# 輸入要查詢的名字
read -p "Please input a name: " name
found=0

#
# 搜尋 Score 陣列的索引是否有此名字
#
# ${!Score[@]}: 加上 "!" 表示陣列的索引
#
for key in ${!Score[@]}
do
        if [ "$key" == "$name" ]; then
                found=1
                break
        fi
done

# 印出搜尋結果
if [ "$found" -eq "1" ]; then
        echo "The score of $name is ${Score[$name]}"
else
        echo "The name of \"$name\" cannot be found."
fi

2017年10月12日 星期四

桌遊 | 板橋桌遊店

最後更新日期:2018/11/28
底下資訊僅供參考,最新資訊請以官網公佈為準。

01. 漫果子桌遊
致理店:
※ 地址: 新北市板橋區文化路一段339號2樓
※ 電話: (02)2255-3707
※ 營業時間:
    週一至週日 13:00 - 22:00
消費方式:
※ 交通: 捷運新埔站一號出口,沿著文化路一段方向直走,約 300 公尺走 4 分鐘可到達,中途會經過郵局。





板橋店:
※ 地址: 新北市板橋區重慶路290-2號

<<文章已經搬家,歡迎點此連結看完整文章內容>>

2017年10月11日 星期三

Troubleshooting | 問題排除 TFTP 沒反應

發生狀況:
想要從 U-boot 透過 tftpboot 來上傳韌體到板子上,先在 PC 上執行 TFTPD32 做為 TFTP server,然後在 U-boot 下執行 tftpboot 指令,但是卻不成功。

偵錯步驟:
1. 確認板子有送出 TFTP 的封包給 PC,執行 PC 上的 Wireshark  抓取封包,在 display filter 中輸入 "tftp" 來過濾出 TFTP 的封包,有看到板子送出的 TFTP 封包,但是 PC 上的 TFTPD32 並沒有回應。


















2. 執行 PC 上的命令提示字元,輸入 "netstat -p UDP -ano" 可以看到 PC 開啟的 UDP port 有哪些,找 Port 為 69 的那行,因為有用 -o 參數,所以最後一個數字是開啟此 Port 程式的 PID。

















3. 啟動 PC 上的工作管理員,選"處理程序"頁籤,再選下拉選單 "檢視" -> "選取欄位",勾選 PID (處理程序識別碼) 後按確定,可以看到新增的欄位 PID,用上一步驟找到的 PID (例: 1068) 去搜尋,找到後確認此 PID 是否對應到 TFTPD32 這個程式。




























































































4. 發現此 PID 竟然對應到另一個 TFTP server 程式,原來是在 TFTPD32 執行前已經有另一個 TFTP server 在執行,UDP Port 69 已經被佔用,找到問題。

備註
1. Wireshark: https://www.wireshark.org/download.html
2. TFTP port number: https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers