?? twodim.sh
字號:
#!/bin/bash# twodim.sh: 模擬一個二維數組. # 一維數組由單行組成. # 二維數組由連續的多行組成. Rows=5Columns=5# 5 X 5 的數組.declare -a alpha # char alpha [Rows] [Columns]; # 沒必要聲明. 為什么?load_alpha (){local rc=0local indexfor i in A B C D E F G H I J K L M N O P Q R S T U V W X Ydo # 你可以隨你的心意, 使用任意符號. local row=`expr $rc / $Columns` local column=`expr $rc % $Rows` let "index = $row * $Rows + $column" alpha[$index]=$i# alpha[$row][$column] let "rc += 1"done # 更簡單的方法: #+ declare -a alpha=( A B C D E F G H I J K L M N O P Q R S T U V W X Y )#+ 但是如果寫的話, 就缺乏二維數組的"風味"了. }print_alpha (){local row=0local indexechowhile [ "$row" -lt "$Rows" ] # 以"行序為主"進行打印: do #+ 行號不變(外層循環), #+ 列號進行增長. (譯者注: 就是按行打印) local column=0 echo -n " " # 按照行方向打印"正方形"數組. while [ "$column" -lt "$Columns" ] do let "index = $row * $Rows + $column" echo -n "${alpha[index]} " # alpha[$row][$column] let "column += 1" done let "row += 1" echodone # 更簡單的等價寫法為: # echo ${alpha[*]} | xargs -n $Columnsecho}filter () # 過濾掉負的數組下標. {echo -n " " # 產生傾斜. # 解釋一下, 這是怎么做到的. if [[ "$1" -ge 0 && "$1" -lt "$Rows" && "$2" -ge 0 && "$2" -lt "$Columns" ]]then let "index = $1 * $Rows + $2" # 現在, 按照旋轉方向進行打印. echo -n " ${alpha[index]}" # alpha[$row][$column]fi } rotate () # 將數組旋轉45度 --{ #+ 從左下角進行"平衡". local rowlocal columnfor (( row = Rows; row > -Rows; row-- )) do # 反向步進數組, 為什么? for (( column = 0; column < Columns; column++ )) do if [ "$row" -ge 0 ] then let "t1 = $column - $row" let "t2 = $column" else let "t1 = $column" let "t2 = $column + $row" fi filter $t1 $t2 # 將負的數組下標過濾出來. # 如果你不做這一步, 將會怎樣? done echo; echodone # 數組旋轉的靈感來源于Herbert Mayer所著的#+ "Advanced C Programming on the IBM PC"的例子(第143-146頁)#+ (參見參考書目). # 由此可見, C語言能夠做到的好多事情, #+ 用shell腳本一樣能夠做到. }#--------------- 現在, 讓我們開始吧. ------------#load_alpha # 加載數組. print_alpha # 打印數組. rotate # 逆時鐘旋轉45度打印. #-----------------------------------------------------#exit 0# 這是有點做作, 不是那么優雅. # 練習:# -----# 1) 重新實現數組加載和打印函數, # 讓其更直觀, 可讀性更強. ## 2) 詳細地描述旋轉函數的原理. # 提示: 思考一下倒序索引數組的實現. ## 3) 重寫這個腳本, 擴展它, 讓不僅僅能夠支持非正方形的數組. # 比如6 X 4的數組. # 嘗試一下, 在數組旋轉時, 做到最小"失真".
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -