⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twodim.sh

📁 BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版
💻 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 + -