📄 colorizing.html
字号:
56 # Set a unique (paranoid) name for the temp directory the script needs. 57 HORSE_RACE_TMP_DIR=$HOME/.horserace-`date +%s`-`head -c10 /dev/urandom \ 58 | md5sum | head -c30` 59 60 # Create the temp directory and move right in. 61 mkdir $HORSE_RACE_TMP_DIR 62 cd $HORSE_RACE_TMP_DIR 63 64 65 # This function moves the cursor to line $1 column $2 and then prints $3. 66 # E.g.: "move_and_echo 5 10 linux" is equivalent to 67 #+ "tput cup 4 9; echo linux", but with one command instead of two. 68 # Note: "tput cup" defines 0 0 the upper left angle of the terminal, 69 #+ echo defines 1 1 the upper left angle of the terminal. 70 move_and_echo() { 71 echo -ne "\E[${1};${2}H""$3" 72 } 73 74 # Function to generate a pseudo-random number between 1 and 9. 75 random_1_9 () 76 { 77 head -c10 /dev/urandom | md5sum | tr -d [a-z] | tr -d 0 | cut -c1 78 } 79 80 # Two functions that simulate "movement," when drawing the horses. 81 draw_horse_one() { 82 echo -n " "//$MOVE_HORSE// 83 } 84 draw_horse_two(){ 85 echo -n " "\\\\$MOVE_HORSE\\\\ 86 } 87 88 89 # Define current terminal dimension. 90 N_COLS=`tput cols` 91 N_LINES=`tput lines` 92 93 # Need at least a 20-LINES X 80-COLUMNS terminal. Check it. 94 if [ $N_COLS -lt 80 ] || [ $N_LINES -lt 20 ]; then 95 echo "`basename $0` needs a 80-cols X 20-lines terminal." 96 echo "Your terminal is ${N_COLS}-cols X ${N_LINES}-lines." 97 exit $E_RUNERR 98 fi 99 100 101 # Start drawing the race field. 102 103 # Need a string of 80 chars. See below. 104 BLANK80=`seq -s "" 100 | head -c80` 105 106 clear 107 108 # Set foreground and background colors to white. 109 echo -ne '\E[37;47m' 110 111 # Move the cursor on the upper left angle of the terminal. 112 tput cup 0 0 113 114 # Draw six white lines. 115 for n in `seq 5`; do 116 echo $BLANK80 # Use the 80 chars string to colorize the terminal. 117 done 118 119 # Sets foreground color to black. 120 echo -ne '\E[30m' 121 122 move_and_echo 3 1 "START 1" 123 move_and_echo 3 75 FINISH 124 move_and_echo 1 5 "|" 125 move_and_echo 1 80 "|" 126 move_and_echo 2 5 "|" 127 move_and_echo 2 80 "|" 128 move_and_echo 4 5 "| 2" 129 move_and_echo 4 80 "|" 130 move_and_echo 5 5 "V 3" 131 move_and_echo 5 80 "V" 132 133 # Set foreground color to red. 134 echo -ne '\E[31m' 135 136 # Some ASCII art. 137 move_and_echo 1 8 "..@@@..@@@@@...@@@@@.@...@..@@@@..." 138 move_and_echo 2 8 ".@...@...@.......@...@...@.@......." 139 move_and_echo 3 8 ".@@@@@...@.......@...@@@@@.@@@@...." 140 move_and_echo 4 8 ".@...@...@.......@...@...@.@......." 141 move_and_echo 5 8 ".@...@...@.......@...@...@..@@@@..." 142 move_and_echo 1 43 "@@@@...@@@...@@@@..@@@@..@@@@." 143 move_and_echo 2 43 "@...@.@...@.@.....@.....@....." 144 move_and_echo 3 43 "@@@@..@@@@@.@.....@@@@...@@@.." 145 move_and_echo 4 43 "@..@..@...@.@.....@.........@." 146 move_and_echo 5 43 "@...@.@...@..@@@@..@@@@.@@@@.." 147 148 149 # Set foreground and background colors to green. 150 echo -ne '\E[32;42m' 151 152 # Draw eleven green lines. 153 tput cup 5 0 154 for n in `seq 11`; do 155 echo $BLANK80 156 done 157 158 # Set foreground color to black. 159 echo -ne '\E[30m' 160 tput cup 5 0 161 162 # Draw the fences. 163 echo "++++++++++++++++++++++++++++++++++++++\ 164 ++++++++++++++++++++++++++++++++++++++++++" 165 166 tput cup 15 0 167 echo "++++++++++++++++++++++++++++++++++++++\ 168 ++++++++++++++++++++++++++++++++++++++++++" 169 170 # Set foreground and background colors to white. 171 echo -ne '\E[37;47m' 172 173 # Draw three white lines. 174 for n in `seq 3`; do 175 echo $BLANK80 176 done 177 178 # Set foreground color to black. 179 echo -ne '\E[30m' 180 181 # Create 9 files to stores handicaps. 182 for n in `seq 10 7 68`; do 183 touch $n 184 done 185 186 # Set the first type of "horse" the script will draw. 187 HORSE_TYPE=2 188 189 # Create position-file and odds-file for every "horse". 190 #+ In these files, store the current position of the horse, 191 #+ the type and the odds. 192 for HN in `seq 9`; do 193 touch horse_${HN}_position 194 touch odds_${HN} 195 echo \-1 > horse_${HN}_position 196 echo $HORSE_TYPE >> horse_${HN}_position 197 # Define a random handicap for horse. 198 HANDICAP=`random_1_9` 199 # Check if the random_1_9 function returned a good value. 200 while ! echo $HANDICAP | grep [1-9] &> /dev/null; do 201 HANDICAP=`random_1_9` 202 done 203 # Define last handicap position for horse. 204 LHP=`expr $HANDICAP \* 7 + 3` 205 for FILE in `seq 10 7 $LHP`; do 206 echo $HN >> $FILE 207 done 208 209 # Calculate odds. 210 case $HANDICAP in 211 1) ODDS=`echo $HANDICAP \* 0.25 + 1.25 | bc` 212 echo $ODDS > odds_${HN} 213 ;; 214 2 | 3) ODDS=`echo $HANDICAP \* 0.40 + 1.25 | bc` 215 echo $ODDS > odds_${HN} 216 ;; 217 4 | 5 | 6) ODDS=`echo $HANDICAP \* 0.55 + 1.25 | bc` 218 echo $ODDS > odds_${HN} 219 ;; 220 7 | 8) ODDS=`echo $HANDICAP \* 0.75 + 1.25 | bc` 221 echo $ODDS > odds_${HN} 222 ;; 223 9) ODDS=`echo $HANDICAP \* 0.90 + 1.25 | bc` 224 echo $ODDS > odds_${HN} 225 esac 226 227 228 done 229 230 231 # Print odds. 232 print_odds() { 233 tput cup 6 0 234 echo -ne '\E[30;42m' 235 for HN in `seq 9`; do 236 echo "#$HN odds->" `cat odds_${HN}` 237 done 238 } 239 240 # Draw the horses at starting line. 241 draw_horses() { 242 tput cup 6 0 243 echo -ne '\E[30;42m' 244 for HN in `seq 9`; do 245 echo /\\$HN/\\" " 246 done 247 } 248 249 print_odds 250 251 echo -ne '\E[47m' 252 # Wait for a enter key press to start the race. 253 # The escape sequence '\E[?25l' disables the cursor. 254 tput cup 17 0 255 echo -e '\E[?25l'Press [enter] key to start the race... 256 read -s 257 258 # Disable normal echoing in the terminal. 259 # This avoids key presses that might "contaminate" the screen 260 #+ during the race. 261 stty -echo 262 263 # -------------------------------------------------------- 264 # Start the race. 265 266 draw_horses 267 echo -ne '\E[37;47m' 268 move_and_echo 18 1 $BLANK80 269 echo -ne '\E[30m' 270 move_and_echo 18 1 Starting... 271 sleep 1 272 273 # Set the column of the finish line. 274 WINNING_POS=74 275 276 # Define the time the race started. 277 START_TIME=`date +%s` 278 279 # COL variable needed by following "while" construct. 280 COL=0 281 282 while [ $COL -lt $WINNING_POS ]; do 283 284 MOVE_HORSE=0 285 286 # Check if the random_1_9 function has returned a good value. 287 while ! echo $MOVE_HORSE | grep [1-9] &> /dev/null; do 288 MOVE_HORSE=`random_1_9` 289 done 290 291 # Define old type and position of the "randomized horse". 292 HORSE_TYPE=`cat horse_${MOVE_HORSE}_position | tail -n 1` 293 COL=$(expr `cat horse_${MOVE_HORSE}_position | head -n 1`) 294 295 ADD_POS=1 296 # Check if the current position is an handicap position. 297 if seq 10 7 68 | grep -w $COL &> /dev/null; then 298 if grep -w $MOVE_HORSE $COL &> /dev/null; then 299 ADD_POS=0 300 grep -v -w $MOVE_HORSE $COL > ${COL}_new 301 rm -f $COL 302 mv -f ${COL}_new $COL 303 else ADD_POS=1 304 fi 305 else ADD_POS=1 306 fi 307 COL=`expr $COL + $ADD_POS` 308 echo $COL > horse_${MOVE_HORSE}_position # Store new position. 309 310 # Choose the type of horse to draw. 311 case $HORSE_TYPE in 312 1) HORSE_TYPE=2; DRAW_HORSE=draw_horse_two 313 ;; 314 2) HORSE_TYPE=1; DRAW_HORSE=draw_horse_one 315 esac 316 echo $HORSE_TYPE >> horse_${MOVE_HORSE}_position 317 # Store current type. 318 319 # Set foreground color to black and background to green. 320 echo -ne '\E[30;42m' 321 322 # Move the cursor to new horse position. 323 tput cup `expr $MOVE_HORSE + 5` \ 324 `cat horse_${MOVE_HORSE}_position | head -n 1` 325 326 # Draw the horse. 327 $DRAW_HORSE 328 usleep $USLEEP_ARG 329 330 # When all horses have gone beyond field line 15, reprint odds. 331 touch fieldline15 332 if [ $COL = 15 ]; then 333 echo $MOVE_HORSE >> fieldline15 334 fi 335 if [ `wc -l fieldline15 | cut -f1 -d " "` = 9 ]; then 336 print_odds 337 : > fieldline15 338 fi 339 340 # Define the leading horse. 341 HIGHEST_POS=`cat *position | sort -n | tail -1` 342 343 # Set background color to white. 344 echo -ne '\E[47m' 345 tput cup 17 0 346 echo -n Current leader: `grep -w $HIGHEST_POS *position | cut -c7`\ 347 " " 348 349 done 350 351 # Define the time the race finished. 352 FINISH_TIME=`date +%s` 353 354 # Set background color to green and enable blinking text. 355 echo -ne '\E[30;42m' 356 echo -en '\E[5m' 357 358 # Make the winning horse blink. 359 tput cup `expr $MOVE_HORSE + 5` \ 360 `cat horse_${MOVE_HORSE}_position | head -n 1` 361 $DRAW_HORSE 362 363 # Disable blinking text. 364 echo -en '\E[25m' 365 366 # Set foreground and background color to white. 367 echo -ne '\E[37;47m' 368 move_and_echo 18 1 $BLANK80 369 370 # Set foreground color to black. 371 echo -ne '\E[30m' 372 373 # Make winner blink. 374 tput cup 17 0 375 echo -e "\E[5mWINNER: $MOVE_HORSE\E[25m"" Odds: `cat odds_${MOVE_HORSE}`"\ 376 " Race time: `expr $FINISH_TIME - $START_TIME` secs" 377 378 # Restore cursor and old colors. 379 echo -en "\E[?25h" 380 echo -en "\E[0m" 381 382 # Restore echoing. 383 stty echo 384 385 # Remove race temp directory. 386 rm -rf $HORSE_RACE_TMP_DIR 387 388 tput cup 19 0 389 390 exit 0</PRE></TD></TR></TABLE><HR></DIV><P>See also <AHREF="contributed-scripts.html#HASHEXAMPLE">Example A-23</A> and <AHREF="contributed-scripts.html#HOMEWORK">Example A-40</A>.</P><DIVCLASS="CAUTION"><TABLECLASS="CAUTION"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/caution.png"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>There is, however, a major problem with all this. <SPANCLASS="emphasis"><ICLASS="EMPHASIS">ANSI escape sequences are emphatically non-portable.</I></SPAN> What works fine on some terminal emulators (or the console) may work differently, or not at all, on others. A <SPANCLASS="QUOTE">"colorized"</SPAN> script that looks stunning on the script author's machine may produce unreadable output on someone else's. This greatly compromises the usefulness of <SPANCLASS="QUOTE">"colorizing"</SPAN> scripts, and possibly relegates this technique to the status of a gimmick or even a <SPANCLASS="QUOTE">"toy"</SPAN>.</P></TD></TR></TABLE></DIV><P>Moshe Jacobson's <BCLASS="COMMAND">color</B> utility (<AHREF="http://runslinux.net/projects.html#color"TARGET="_top">http://runslinux.net/projects.html#color</A>) considerably simplifies using ANSI escape sequences. It substitutes a clean and logical syntax for the clumsy constructs just discussed.</P><P>Henry/teikedvl has likewise created a utility (<AHREF="http://scriptechocolor.sourceforge.net/"TARGET="_top">http://scriptechocolor.sourceforge.net/</A>) to simplify creation of colorized scripts.</P></DIV><H3CLASS="FOOTNOTES">Notes</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN18700"HREF="colorizing.html#AEN18700">[1]</A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P><SPANCLASS="ACRONYM">ANSI</SPAN> is, of course, the acronym for the American National Standards Institute. This august body establishes and maintains various technical and industrial standards.</P></TD></TR></TABLE><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="recursionsct.html"ACCESSKEY="P">Prev</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="optimizations.html"ACCESSKEY="N">Next</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">A script calling itself (recursion)</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="miscellany.html"ACCESSKEY="U">Up</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">Optimizations</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -