Archive for the ‘Shell’ Category

转Linux下的shell五子棋小游戏

星期六, 10月 6th, 2007

#!/bin/sh
# Programname: five
# Author: CLD
# 2004.01
#
L()
{
# 屏幕任意位置
  h=$1;l=$2
  echo -n “[$h;$l;H"
}

## 界面颜色控制变量
white_b=""        # 白底黑字
green_b=""        # 绿底黑字(移动棋字亮块)
blue_b=""         # 兰底白字
gray_b=""       # 灰底黑字
gray_w=""       # 灰底白字
black_w=""      # 黑底白字
# 棋盘换色控制变量
brown_b=""        # 桔黄底黑棋
brown_w=""        # 桔黄底白棋
mage_b=""         # 紫底黑棋
mage_w=""         # 紫底白棋
lt_blue_b=""    # 浅兰底黑棋
lt_blue_w=""    # 浅兰底白棋

kkk()
{
# 棋盘
  L 1 22;echo "$gray_b                                  $black_w"
  L 2 22;echo "$gray_b  ┏┯┯┯┯┯┯┯┯┯┯┯┯┯┓  $black_w"
  L 3 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 4 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 5 22;echo "$gray_b  ┠┼┼╋┼┼┼┼┼┼┼╋┼┼┨  $black_w"
  L 6 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 7 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 8 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 9 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 10 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 11 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 12 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 13 22;echo "$gray_b  ┠┼┼╋┼┼┼┼┼┼┼╋┼┼┨  $black_w"
  L 14 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 15 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  L 16 22;echo "$gray_b  ┗┷┷┷┷┷┷┷┷┷┷┷┷┷┛  $black_w"
  L 17 22;echo "$gray_b                                  $black_w"
}

getchar()
{
  key=`stty -g`
  stty -echo
  stty raw
  dd if=/dev/tty bs=1 count=1 2>/dev/null
  stty -raw
  stty echo
  stty $key
}
        
clear
kkk
  L 5 34;echo " 五 子 棋 "   
  L 10 24;echo "┌────游戏○设定────┐"
  L 11 24;echo "│                          │"
  L 12 24;echo "│  1_白先走  2_黑先走 [ ]  │”
  L 13 24;echo “│                          │”
  L 14 24;echo “└─────────────┘”
  L 12 48;echo -n
goo=`getchar`
case $goo in
  1) go=”白”;ss=0;sss=0;;
  2) go=”黑”;ss=1;sss=1;;
  *) clear;exit;;
esac
  by=0;bs=0;bsy=0;hy=0;hs=0;hsy=0  #初始化输赢局数
tput civis

help()
{
L 16 3;echo “┏━━━━━━━┓”
L 16 57;echo “┏━━━━━━━┓”
L 17 3;echo “┃              ┃”
L 17 57;echo “┃              ┃”
L 18 3;echo “┃              ┃                                    ┃              ┃”
L 19 3;echo “┃ 赢盘数:      ┃┏━━━━━”$gray_b” m—和为贵 “$black_w”━━━━━┓┃ 赢盘数:      ┃”
L 20 3;echo “┃ 输盘数:      ┃┃ 友                          比 ┃┃ 输盘数:      ┃”
L 21 3;echo “┃              ┃┃ 谊   ”$white_b”Press c change color”$black_w”   赛 ┃┃              ┃”
L 22 3;echo “┃              ┃┃ 第                          第 ┃┃              ┃”
L 23 3;echo “┃ 最后成绩:    ┃┃ 一                          二 ┃┃ 最后成绩:    ┃”
L 24 3;echo “┗━━━━━━━┛┗━━━━━━━━━━━━━━━━┛┗━━━━━━━┛”
}

init_(){   # 继续棋局初始化
kkk >abc
a1=2      
a2=38
b1=52
b2=16
write=$green_b$go$black_w
cat abc
L $a1 $a2;echo $write  # 棋子初始位置
ccc=1  #改变颜色次数
color1=`expr substr $gray_b 3 8`;color2=`expr substr $gray_w 3 8` #默认棋子颜色
L 19 13;echo $by;L 19 68;echo $hy
L 20 13;echo $bs;L 20 68;echo $hs
L 23 15;echo $bsy”  ”;L 23 70;echo $hsy”  ”
}
init_
help

## 棋子移动函数
left(){    ##左移
if [ $a2 -eq 24 ];then a2=24;else a2=`expr $a2 - 2`;fi
sort -t”[" -n +1 abc
L $a1 $a2;echo $write
}
right(){   ##右移
if [ $a2 -eq $b1 ];then a2=$b1;else a2=`expr $a2 + 2`;fi
sort -t”[" -n +1 abc
L $a1 $a2;echo $write
}
down(){    ##下移
if [ $a1 -eq $b2 ];then a1=$b2;else a1=`expr $a1 + 1`;fi
sort -t”[" -n +1 abc
L $a1 $a2;echo $write
}
up(){     ##上移
if [ $a1 -eq 2 ];then a1=2;else a1=`expr $a1 - 1`;fi
sort -t”[" -n +1 abc
L $a1 $a2;echo $write
}

sy(){    # 继续棋局输方先走,统计输赢结果
if [ $qs -eq 7 ];then
  go=”黑”      #如果白棋赢则下一盘黑先走
  run=”白”
  bs=`expr $bs + 0`;by=`expr $by + 1`
  bsy=`expr $by - $bs`
  hy=$bs;hs=$by;hsy=`expr $hy - $hs`
else
  go=”白”      #如果黑棋赢则下一盘白先走
  run=”黑”
  hs=`expr $hs + 0`;hy=`expr $hy + 1`
  hsy=`expr $hy - $hs`
  by=$hs;bs=$hy;bsy=`expr $by - $bs`
fi
}

sy1(){      # 显示输赢结果,统计棋局,询问是否继续  
while true;do
   L 19 13;echo $by;L 19 68;echo $hy
   L 20 13;echo $bs;L 20 68;echo $hs
   L 23 15;echo $bsy”  ”;L 23 70;echo $hsy”  ”
   tput bel;tput bel
   L 6 28;echo $white_b”                      “$black_w
   L 7 28;echo $white_b”    “$run$1″!!!     ”$black_w”  ”$black_w
   L 8 28;echo $white_b”   再来一盘否[y|n]?   ”$black_w”  ”$black_w
   L 9 28;echo $white_b”                      “$black_w”  ”$black_w
   L 10 30;echo “                      ”
key=`getchar`
case $key in
  y)
   init_
   count=`expr $count + 1`
   L 23 36;echo “第 $count 局”
   break;;
  n)
   clear;cat abc
   L 7 30;echo $blue_b”                  ”$black_w   
   L 8 30;echo $blue_b”    “!!!再见!!!”    “$black_w”  ”$black_w
   L 9 30;echo $blue_b”                  ”$black_w”  ”$black_w
   L 10 30;echo $blue_b”  ”Author: c1l2d3″  ”$black_w”  ”$black_w
   L 11 30;echo $blue_b”                  ”$black_w”  ”$black_w
   L 12 32;echo $black_w”                  ”$black_w
   tput cnorm
   rm yyy;exit;;
  *);;
esac
done
}

award()  #判断输赢函数
{
cat abc|sed -n 18,”$”p|awk -F”;” ‘{print $1,$2,$4}’|sed ’s/^..//’ \
|awk ‘{print $1,$2,substr($3,2,1)}’ >yyy               # 计算输赢临时文件      
grep “$qs$” yyy|sort -r -n +0 +1|awk ‘$2+=(NR*2)’ \
|uniq -c|awk ‘{print $1}’|grep ‘[5-9]‘ >/dev/null 2>&1
if [ $? -eq 0 ];then sy;sy1 “棋赢啦!   ”;fi            # 横连子>=5        
grep “$qs$” yyy|sort -r -n +1|awk ‘$1+=NR’ \
|uniq -c|awk ‘{print $1}’|grep ‘[5-9]‘ >/dev/null 2>&1
if [ $? -eq 0 ];then sy;sy1 “棋赢啦!   ” ;fi           # 竖连子>=5      
grep “$qs$” yyy|sort -r -n +0 +1|awk ‘$1=$1+$2/2′|sort -r -n \
|awk ‘$2+=(NR*2)’|uniq -c|awk ‘{print $1}’|grep ‘[5-9]‘ >/dev/null 2>&1
if [ $? -eq 0 ];then sy;sy1 “棋赢啦!   ”;fi            # 右斜连子>=5
grep “$qs$” yyy|sort -r -n +0 +1|awk ‘$1=$1-$2/2′|sort -r -n \
|awk ‘$2+=(NR*2)’|uniq -c|awk ‘{print $1}’|grep ‘[5-9]‘ >/dev/null 2>&1
if [ $? -eq 0 ];then sy;sy1 “棋赢啦!   ”;fi            # 左斜连子>=5
}

count=1    #局数
while true
do
  L 1 4;echo $white_b” 【执白方】 “$black_w
  L 4 5;echo $gray_b” a—左移 “$black_w
  L 6 5;echo $gray_b” d—右移 “$black_w
  L 8 5;echo $gray_b” w—上移 “$black_w
  L 10 5;echo $gray_b” s—下移 “$black_w
  L 12 5;echo $gray_b” p—落子 “$black_w
  L 14 5;echo $gray_b” ]—投降 “$black_w
  L 1 62;echo $white_b” 【执黑方】 “$black_w
  L 4 63;echo $gray_b” 4—左移 “$black_w
  L 6 63;echo $gray_b” 6—右移 “$black_w
  L 8 63;echo $gray_b” 8—上移 “$black_w
  L 10 63;echo $gray_b” 5—下移 “$black_w
  L 12 63;echo $gray_b” 9—落子 “$black_w
  L 14 63;echo $gray_b” 0—投降 “$black_w
  L 22 1;echo -n
  L 23 36;echo “第 $count 局”
  cc=`getchar`
case $cc in
  a|4)
   if [ $ss -eq 0 ] && [ "$cc" = "a" ];then left;fi
   if [ $ss -eq 1 ] && [ "$cc" = "4" ];then left;fi;;
  d|6)
   if [ $ss -eq 0 ] && [ "$cc" = "d" ];then right;fi
   if [ $ss -eq 1 ] && [ "$cc" = "6" ];then right;fi;;
  s|5)
   if [ $ss -eq 0 ] && [ "$cc" = "s" ];then down;fi
   if [ $ss -eq 1 ] && [ "$cc" = "5" ];then down;fi;;
  w|8)
   if [ $ss -eq 0 ] && [ "$cc" = "w" ];then up;fi
   if [ $ss -eq 1 ] && [ "$cc" = "8" ];then up;fi;;
  m)
    run=”此局和棋!    “;sy1;;
  p|9)
   if [ $ss -eq 0 ] && [ "$cc" = "p" ];then
    sed -n 18,”$”p abc|grep “\[$a1;$a2" 2>&1  
    if [ $? -eq 0 ];then L 10 32;echo “  此处已有棋…”;tput bel;sleep 1
      write=$green_b白$black_w
      sss=0
    else
       mm=`L $a1 $a2`[$color2●$black_w
      echo $mm>>abc
      write=$green_b黑$black_w
      sss=1
    fi
    sort -t"[" -n +1 abc
    qs=7
    award;tput bel   
   fi
   if [ $ss -eq 1 ] && [ "$cc" = "9" ];then
    sed -n 18,”$”p abc|grep “\[$a1;$a2" 2>&1  
    if [ $? -eq 0 ];then L 10 32;echo “  此处已有棋…”;tput bel;sleep 1
      write=$green_b黑$black_w
      sss=1
    else
       mm=`L $a1 $a2`”[$color1●$black_w"
      echo $mm>>abc
      write=$green_b白$black_w
      sss=0
    fi
    sort -t"[" -n +1 abc
    qs=0
    award;tput bel
   fi
    ss=$sss;;  # 落子方不允许再走,等待对方走棋
  0|])
    if [ "$cc" = "]” ];then go=”白”;run=”白”;bs=`expr $bs + 1`
      by=`expr $by + 0`
      bsy=`expr $by - $bs`
      hy=$bs;hs=$by;hsy=`expr $hy - $hs`
      sss=0
    else go=”黑”;run=”黑”;hs=`expr $hs + 1`;hy=`expr $hy + 0`
      hsy=`expr $hy - $hs`
      by=$hs;bs=$hy;bsy=`expr $by - $bs`
      sss=1
    fi
      ss=$sss  #谁投降谁下一局先走
    sy1 “棋投降啦”;;
  c)
    md=$ccc    # 变换棋盘颜色
     if [ $md -eq 1 ];then
      def1=`expr substr $gray_b 3 8`;def2=`expr substr $gray_w 3 8`
      color1=`expr substr $brown_b 3 6`;color2=`expr substr $brown_w 3 6`
      sed ’s/’$def1′/’$color1′/g’ abc|sed ’s/’$def2′/’$color2′/g’ >abc.tmp
      mv abc.tmp abc
      cat abc
      ccc=`expr $ccc + 1`
     fi    # 桔黄色
     if [ $md -eq 2 ];then
      def1=`expr substr $brown_b 3 6`;def2=`expr substr $brown_w 3 6`
      color1=`expr substr $lt_blue_b 3 8`;color2=`expr substr $lt_blue_w 3 8`
      sed ’s/’$def1′/’$color1′/g’ abc|sed ’s/’$def2′/’$color2′/g’ >abc.tmp
      mv abc.tmp abc
      cat abc
      ccc=`expr $ccc + 1`
     fi    # 浅蓝色
     if [ $md -eq 3 ];then
      def1=`expr substr $lt_blue_b 3 8`;def2=`expr substr $lt_blue_w 3 8`
      color1=`expr substr $mage_b 3 6`;color2=`expr substr $mage_w 3 6`
      sed ’s/’$def1′/’$color1′/g’ abc|sed ’s/’$def2′/’$color2′/g’ >abc.tmp
      mv abc.tmp abc
      cat abc
      ccc=`expr $ccc - 3`
     fi    # 紫色
     if [ $md -eq 0 ];then
      def1=`expr substr $mage_b 3 6`;def2=`expr substr $mage_w 3 6`
      color1=`expr substr $gray_b 3 8`;color2=`expr substr $gray_w 3 8`
      sed ’s/’$def1′/’$color1′/g’ abc|sed ’s/’$def2′/’$color2′/g’ >abc.tmp
      mv abc.tmp abc
      cat abc
      ccc=`expr $ccc + 1`
     fi    # 灰色
     L 2 38;echo $write;;
  esac
done

EX正则用法收集

星期三, 10月 3rd, 2007

统计每行出现o字符的数量

awk -Fo ‘{num=(NF-1);{if(num>1)print NR,”line:”,num}}’ filename
awk ‘{print NR,gsub(/\o/,”o”)}’ filename

在每行前插入行号
awk ‘{print NR,$0}’ urfile
cat -n urfile

在每行前插入字符
sed ’s/.*/string&/’ urfile
cat text.txt | sed “s/\(^\)/YES\1/g”

根据分割符取值
echo “/:string:$1$$CoERg7ynjYLsj2j4glJ34.”|cut -d’:’ -f2
echo “/:string:$1$$CoERg7ynjYLsj2j4glJ34.”|awk -F: ‘{print $2}’

 除第一行不打印
cut -d’ ‘ -f2-
awk ‘{$1=”";print}’
sed ’s/^[^[:blank:]]*//’

cut命令介绍

星期五, 09月 28th, 2007

用法:cut -cnum1-num2 filename

说明:显示每行从开头算起 num1 到 num2 的文字。

范例:

shell>> cat example
test2
this is test1
shell>> cut -c0-6 example ## print 开头算起前 6 个字元
test2
this i

cut其实很有用
-c m-n 表示显示每一行的第m个字元到第n个字元。例如:

———file———–
liubi 23 14000
———file———–
# cut -c 3-9,12-20 file
liubi 14000

-f m-n 表示显示第m栏到第n栏(使用tab分隔)。例如:
———file———–
liubi 23 14000
———file———–
# cut -f 1,3 file
liubi 14000
使用|分隔
cut -d’|’ -f2 1.test>2.test
使用:分隔
cut -d’:’ -f2 1.test>2.test

sort排序的使用方法

星期五, 09月 28th, 2007

有一个文本,内容如下:
abcd|efasd|001|….
aaaa|bbbb|003|….
dddd|ddd|004|….
cccc|eeee|002|….

使其按照第三列排序输出:
abcd|efasd|001|….
cccc|eeee|002|….
aaaa|bbbb|003|….
dddd|ddd|004|….

使用sed命令实现有3种,具体如下:
1、sort -t”|” -n -k3 filename
2、sort -t”|” -k3 filename
3、sort -t”|” +3n filename

自定义ls命令显示的颜色

星期六, 09月 8th, 2007

将相关的颜色配置文件复制到用户主目录中并改名为.dir_colors
cp DIR_COLORS ~/.dir_colors

编辑文件~/.dir_colors

.exe 01;32
.com 01;32
.btm 01;32
.bat 01;32
.sh  01;32
.csh 01;32

 其中.exe .com .btm表示的是文件类型,01表示突出显示,32表示颜色为红色
对应的代码如下

00=普通 01=突出显示 04=下划线 05=blink 07=reverse 08=concealed
30=黑 31=红 32=绿 33=黄 34=蓝 35=洋红 36=青色 37=白

重新登陆系统才会生效,看看修改之后的效果吧~~~

将一个文本定向到另一个文本的开头

星期五, 09月 7th, 2007

生成2个文件作为测试 
# seq 1 10 >1
# seq 11 20 >2

查看文件内容
# cat 1
1
2
3
4
5
6
7
8
9
10
# cat 2
11
12
13
14
15
16
17
18
19
20

开始将文件2的内容插入文件1并将新内容重定向到文件3
# cat <(cat 2) <(cat 1) >3

查看操作后的内容
# cat 3
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10

如果文本文件太大比如日志文件则不适合次方法,因为会遍历所有内容

大文件的切割与合并

星期五, 09月 7th, 2007

当前目录下sys.tgz文件为98M大小
# ls -l sys.tgz
-rw-r–r–  1 root root 102400000 Mar 28 16:32 sys.tgz
用split将文件切割成32M大小

# split -b 32m sys.tgz
# ls -l
total 200216-rw-r–r–  1 root root 102400000 Mar 28 16:32 sys.tgz
-rw-r–r–  1 root root  33554432 Mar 28 16:33 xaa
-rw-r–r–  1 root root  33554432 Mar 28 16:33 xab
-rw-r–r–  1 root root  33554432 Mar 28 16:33 xac
-rw-r–r–  1 root root   1736704 Mar 28 16:33 xad
将文件移动到目标机器,合并文件# cat xa* > ./sys.tgz

如果目标主机是windows系统则使用命令
copy /B xaa+xab+xac+xad sys.tgz

生成指定大小的文件

星期五, 09月 7th, 2007

dd if=/dev/zero of=100M.bin bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.256523 seconds, 409 MB/s

参数1M表示每次读写1M数据,100为读写100次

 这样就生成100M的空镜像文件,问题是,如果要生成1G的虚拟块设备文件,就得占用1G的硬盘空间,而这个镜像文件完全是空的,是不是有一点浪费?好在Linux支持Sparse(稀疏)文件。请看下面的例子

# dd if=/dev/zero of=1G.img bs=1M seek=1000 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 3.3e-05 seconds, 0.0 kB/s

# ls -l 1G.img
-rw-r–r– 1 root  root  1048576000 Mar 25 15:32 1G.img

# du -m 1G.img
1       1G.img

这里用了一个新的命令seek,表示略过1000个Block不写(这里Block按照bs的定义是1M),count=0表示写入0个Block。用ls命令看新生成的文件,大小可以看出是1000M。但是再用du一看,实际占用硬盘大小只有1M。

Shell中整数和字符串的比较

星期四, 08月 30th, 2007

整数比较
 
-eq    等于,如:if [ “$a” -eq “$b” ]
-ne    不等于,如:if [ “$a” -ne “$b” ]
-gt    大于,如:if [ “$a” -gt “$b” ]
-ge    大于等于,如:if [ “$a” -ge “$b” ]
-lt    小于,如:if [ “$a” -lt “$b” ]
-le    小于等于,如:if [ “$a” -le “$b” ]
<      小于(需要双括号),如:((”$a” < “$b”))
<=     小于等于(需要双括号),如:((”$a” <= “$b”))
>      大于(需要双括号),如:((”$a” > “$b”))
>=     大于等于(需要双括号),如:((”$a” >= “$b”))
 
字符串比较

=      等于,如:if [ “$a” = “$b” ]
==     等于,如:if [ “$a” == “$b” ],与=等价
      注意:==的功能在[[]]和[]中的行为是不同的,如下:
      1 [[ $a == z* ]]         # 如果$a以”z”开头(模式匹配)那么将为true
      2 [[ $a == “z*” ]]     # 如果$a等于z*(字符匹配),那么结果为true
      3 
      4 [ $a == z* ]           # File globbing 和word splitting将会发生
      5 [ “$a” == “z*” ]   # 如果$a等于z*(字符匹配),那么结果为true
      一点解释,关于File globbing是一种关于文件的速记法,比如”*.c”就是,再如~也是.
      但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!=    不等于,如:if [ “$a” != “$b” ]
      这个操作符将在[[]]结构中使用模式匹配.
<     小于,在ASCII字母顺序下.如:
      if [[ "$a" < "$b" ]]
      if [ "$a" \< "$b" ]
      注意:在[]结构中”<”需要被转义.
>     大于,在ASCII字母顺序下.如:
      if [[ “$a” > “$b” ]]
      if [ “$a” \> “$b” ]
      注意:在[]结构中”>”需要被转义.
      具体参考Example 26-11来查看这个操作符应用的例子.
-z    字符串为”null”.就是长度为0.
-n    字符串不为”null”

注意:
使用-n在[]结构中测试必须要用””把变量引起来.使用一个未被””的字符串来使用! -z
或者就是未用””引用的字符串本身,放到[]结构中。虽然一般情况下可
 以工作,但这是不安全的.习惯于使用””来测试字符串是一种好习惯

ANSI控制码

星期三, 08月 29th, 2007
ANSI控制码
例如:
  echo -ne “\33[32m” 可以将字符的显示颜色改为绿色
  echo -ne “\33[3;1H” 可以将光标移到第3行第1列处

\33[0m    关闭所有属性
\33[1m    设置高亮度
\33[4m    下划线
\33[5m    闪烁
\33[7m    反显
\33[8m    消隐
\33[30m -- \33[37m  设置前景色
\33[40m -- \33[47m  设置背景色
\33[nA    光标上移n行
\33[nB    光标下移n行
\33[nC    光标右移n行
\33[nD    光标左移n行
\33[y;xH  设置光标位置
\33[2J    清屏
\33[K     清除从光标到行尾的内容
\33[s     保存光标位置
\33[u     恢复光标位置
\33[?25l  隐藏光标
\33[?25h  显示光标