LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: KornLee

【shell脚本欣赏区】:[展示你的作品的好去处!欢迎投帖]

[复制链接]
发表于 2005-10-17 22:16:51 | 显示全部楼层

批量编码xvid avi文件脚本

为了用传说中最强的mencoder压缩视频文件到掌上电脑看A片小电影,我刹费苦心写出来的


  1. #!/bin/sh

  2. eval set -- `getopt -o 1234fDd: -- "$@"`

  3. dir='.'

  4. while :
  5. do
  6.         case "$1" in
  7.                 -4)
  8.                 args='-vf scale -zoom -xy 320 -oac mp3lame -lameopts vbr=3:br=64 -ofps 22 -ovc xvid -xvidencopts bitrate=250'
  9.                 shift
  10.                 ;;
  11.                 -3)
  12.                 args='-vf scale -zoom -xy 320 -srate 44100 -oac mp3lame -lameopts abr:br=64 -ofps 20 -ovc xvid -xvidencopts bitrate=200'
  13.                 shift
  14.                 ;;
  15.                 -2)
  16.                 args='-vf scale -zoom -xy 320 -srate 32000 -oac mp3lame -lameopts cbr:br=32:vol=2 -ofps 18 -ovc xvid -xvidencopts bitrate=180'
  17.                 shift
  18.                 ;;
  19.                 -1)
  20.                 args='-vf scale -zoom -xy 320 -srate 22050 -oac mp3lame -lameopts cbr:br=24:vol=2:mode=3 -ofps 15 -ovc xvid -xvidencopts bitrate=150'
  21.                 shift
  22.                 ;;
  23.                 -f)
  24.                 fargs='-sws 4'
  25.                 shift
  26.                 ;;
  27.                 -D)
  28.                 delete=y
  29.                 shift
  30.                 ;;
  31.                 -d)
  32.                 dir=$2
  33.                 shift 2
  34.                 ;;
  35.                 --)
  36.                 shift
  37.                 break
  38.                 ;;
  39.         esac
  40. done

  41. #if [ "$args" = "" ]; then
  42. #        args='-vf scale -zoom -xy 320 -srate 44100 -oac mp3lame -lameopts vbr=3:br=48:vol=1 -ofps 18 -ovc xvid -xvidencopts bitrate=180'
  43. #fi

  44. for i
  45. do
  46.         if [ ! -e "$i" ]; then
  47.                 echo File $i not found
  48.                 continue
  49.         fi

  50.         filename="`basename "$i"`"
  51.         outfile="$dir/${filename%.*}_palm.avi"
  52.        
  53.         subfile="${i%.*}.srt"
  54.         if [ -e "$subfile" ]; then
  55.                 argsub="-sub $subfile -font /usr/share/fonts/zh_CN/TrueType/simhei.ttf -subcp cp936 -subfont-text-scale 4"
  56.         fi
  57.        
  58.         mencoder ${args:-'-vf scale -zoom -xy 320 -srate 44100 -oac mp3lame -lameopts vbr=3:br=48:vol=1 -ofps 18 -ovc xvid -xvidencopts bitrate=180'} $fargs $argsub $i -o $outfile 2> /dev/null

  59.         if [ $? -ne 0 ]; then
  60.                 exit $?
  61.         fi

  62.         if [ "$delete" = "y" ]; then
  63.                 rm -f "$i"
  64.                 if [ "$argsub" != "" ]; then
  65.                         rm -f "$subfile"
  66.                 fi
  67.         fi

  68. done

  69. exit 0
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-10-22 00:36:09 | 显示全部楼层
挺好的 ,我多多向你们学习
回复 支持 反对

使用道具 举报

发表于 2005-10-22 00:44:15 | 显示全部楼层
我只是个新手 ,还看不懂你的代码 ,
回复 支持 反对

使用道具 举报

发表于 2005-12-11 23:04:55 | 显示全部楼层
编写脚本的朋友们:谢谢你们提供的脚本,不过我代表菜鸟们说想说的话:能在脚本里添加注释吗????最好能详细一点,这样有利于想我这样的菜鸟学习。希望你们能考虑考虑...真希望能。
我代表菜鸟们感谢你们。
回复 支持 反对

使用道具 举报

发表于 2005-12-21 08:44:27 | 显示全部楼层
天气预报(限国内城市)
用法
WeatherReport 城市名
如城市名为空则默认为南京

刚学SHELL,请高手指教
=============================================================================
#weather reporter
place=$1
if test "$place" = ""
then
        place="南京"
fi

rm -f index.shtml
wget -q http://weather.sina.com.cn/text/index.shtml


ifzhixia=$(grep "$place" -c index.shtml)
if test "$ifzhixia" = 2
then
        cat index.shtml | grep "$place" -A 3 |sed '1d' | grep '>.\+<' -o |tr -d '<'|tr -d '>' > .weathertemp2
elif test "$ifzhixia" = 1
then
        cat index.shtml | grep "$place" -A 3 | grep '>.\+<' -o |tr -d '<'|tr -d '>' > .weathertemp2
#cat index.shtml | grep "$place" -A 3 | grep '>.\+<' -o |sed 's/.//' | sed 's/.$//' > .weathertemp2
else
        echo "没有该城市的天气讯息!"
        exit 0
fi


placetitle="城市:       "
condition="天气状况:    "
wind="风向风力: "
回复 支持 反对

使用道具 举报

发表于 2005-12-22 12:28:51 | 显示全部楼层
//前面的漏了一点东西,在VI中没有全部COPY出来,不好意思下面是完整的。

天气预报(限国内城市)
用法
WeatherReport 城市名
如城市名为空则默认为南京

刚学SHELL,请高手指教
=============================================================================
#weather reporter@chainone
place=$1
if test "$place" = ""
then
place="南京"
fi

rm -f index.shtml
wget -q http://weather.sina.com.cn/text/index.shtml


ifzhixia=$(grep "$place" -c index.shtml)
if test "$ifzhixia" = 2
then
cat index.shtml | grep "$place" -A 3 |sed '1d' | grep '>.\+<' -o |tr -d '<'|tr -d '>' > .weathertemp2
elif test "$ifzhixia" = 1
then
cat index.shtml | grep "$place" -A 3 | grep '>.\+<' -o |tr -d '<'|tr -d '>' > .weathertemp2
#cat index.shtml | grep "$place" -A 3 | grep '>.\+<' -o |sed 's/.//' | sed 's/.$//' > .weathertemp2
else
echo "没有该城市的天气讯息!"
exit 0
fi

placetitle="城市: "
condition="天气状况: "
wind="风向风力: "
tempr="最低温度:        "
echo "$placetitle" > .weathertemp
echo "$condition" >> .weathertemp
echo "$wind" >> .weathertemp
echo "$tempr" >> .weathertemp

paste .weathertemp .weathertemp2
rm -f index.shtml
回复 支持 反对

使用道具 举报

发表于 2006-2-22 15:39:43 | 显示全部楼层
脚本 输入年、月、日计算星期[独创^_^]

  1. #!/bin/bash
  2. # week
  3. #QQ:82386723  E-mail:sc_fan@163.com

  4. value=year

  5. error()
  6. {
  7. echo $value error! please input again.
  8. continue
  9. }

  10. while
  11.     read -p "Please input $value: " tmp
  12. do
  13.        if [ "$tmp" ]; then
  14.         if [ `echo $tmp | awk '{if($0~/[^0-9]/) print "1"}'` ]; then
  15.            echo $value error! please input again.
  16.            continue
  17.         fi
  18.         else
  19.            error
  20.        fi
  21.       
  22.        case $value in
  23.          year)
  24.             value=month
  25.             year=$tmp
  26.             continue
  27.          ;;
  28.          month)
  29.             if [ $tmp -gt 0 -a $tmp -le 12 ]; then
  30.                value=day
  31.                month=$tmp
  32.                continue
  33.              else
  34.                 error
  35.             fi
  36.          ;;
  37.          day)
  38.             case $month in
  39.               1|3|5|7|8|10|12)
  40.                  if [ $tmp -gt 0 -a $tmp -le 31 ]; then
  41.                     day=$tmp
  42.                     break
  43.                   else
  44.                      error
  45.                  fi
  46.               ;;
  47.               4|6|9|11)
  48.                  if [ $tmp -gt 0 -a $tmp -le 30 ]; then
  49.                     day=$tmp
  50.                     break
  51.                   else
  52.                      error
  53.                  fi
  54.               ;;
  55.               2)
  56.                  case $[year%4] in
  57.                    0)
  58.                       if [ $tmp -gt 0 -a $tmp -le 29 ]; then
  59.                          day=$tmp
  60.                          break
  61.                        else
  62.                           echo $value error! $year is leap year, input again.
  63.                           continue
  64.                       fi
  65.                    ;;
  66.                    *)
  67.                       if [ $tmp -gt 0 -a $tmp -le 28 ]; then
  68.                          day=$tmp
  69.                          break
  70.                        else
  71.                           error
  72.                       fi
  73.                    ;;
  74.                  esac
  75.               ;;
  76.             esac
  77.          ;;
  78.        esac
  79. done

  80. century=$[year/100+1]
  81. declare -i tmp=0

  82. for (( i = 0; i < $[year%28]; i++))
  83. do  if [ $[i%4] = 0 ]; then
  84.        tmp=$[tmp+366]
  85.      else
  86.         tmp=$[tmp+365]
  87.     fi
  88. done

  89. for (( i = 1; i < $month; i++))
  90. do  case $i in
  91.       1|3|5|7|8|10|12)
  92.          tmp=$[tmp+31]
  93.       ;;
  94.       4|6|9|11)
  95.          tmp=$[tmp+30]
  96.       ;;
  97.       2)
  98.          if [ $[year%4] = 0 ]; then
  99.             tmp=$[tmp+29]
  100.           else
  101.              tmp=$[tmp+28]
  102.          fi
  103.       ;;
  104.     esac
  105. done

  106. tmp=$[(tmp+day)%7]
  107. week=(Thursday Friday Saturday Sunday Monday Tuesday Wednesday)
  108. week=${week[tmp]}

  109. echo -e "\nCentury $century $year.$month.$day $week\n"
复制代码


本人使用linux半年多了,水平不济可能有比较罗嗦的语句,望各位不要见笑,还请大家多多指教。
上面的脚本是我自己根据一些规律写出来的,加入了点判定,如果输入字母和符号等错误会提示,从公元0年以后的所有日期都可以算出星期,如果谁有这样的脚本希望帖出来,呵呵
回复 支持 反对

使用道具 举报

发表于 2006-2-24 00:57:15 | 显示全部楼层
一个演示汉诺塔的脚本
主要是练习用 tput 来设置终端的前景,背景色,以及定位光标
水平菜,代码很长,让各位见笑了
  1. #!/bin/bash

  2. ##usage: sh $0 n
  3. ##
  4. ## ------------------->X
  5. ## |
  6. ## |
  7. ## |
  8. ## |   disk 1 -------->     ()
  9. ## |   disk 2 -------->    (())
  10. ## |   disk 3 -------->   ((()))
  11. ## |   disk 4 -------->  (((())))   
  12. ## |   ............     ..........
  13. ## V   disk n-1 -->   ((((((()))))))
  14. ## Y   disk n --> ___(((((((())))))))______   _________________________   ________________________
  15. ##     ground -->|_________________________| |_________________________| |________________________|
  16. ##                         A                             A                            A
  17. ##                         |                             |                            |
  18. ##                         |                             |                            |
  19. ##                     source,1                        aid,2                  destination,3

  20. usage="sh $0 non-negative number"
  21. disks=$1
  22. colums=$((($(tput cols)-4)/3))

  23. ## 底座的 Y 坐标
  24. groundat=$(($(tput lines)-2))

  25. ## 底座source(或1)处,最顶层盘的中心坐标
  26. sourcex=$(($colums/2))
  27. sourcey=$(($groundat-$disks))

  28. ## 底座aid(或2)处,最顶层盘的中心坐标
  29. aidx=$(($colums+2+$sourcex))
  30. aidy=$(($groundat-1))
  31. aidfirst=0

  32. ## 底座destination(或3)处,最顶层盘的中心坐标
  33. destinationx=$(($colums*2+4+$sourcex))
  34. destinationy=$(($groundat-1))
  35. destinationfirst=0

  36. coordinate=''


  37. initdraw()
  38. {
  39.     init_drawdisks
  40.     init_drawground
  41. }

  42. init_drawground()
  43. {
  44.     index=1
  45.     tput cup $groundat 0
  46.    
  47.     for i in 1 2 3
  48.     do
  49.         tput setab $((1+$i))
  50.         while(($index<=$i*$colums+($i-1)*2))
  51.         do
  52.             echo -ne ' '
  53.             index=$(($index+1))
  54.         done
  55.         tput sgr0
  56.         echo -n '  '
  57.         index=$(($index+2))
  58.     done

  59.     tput cup $(tput lines) 0
  60. }

  61. init_drawdisks()
  62. {
  63.     for((offset=0,n=$disks;n>0;n--,offset++))
  64.     do
  65.         drawdisk $(($colums/2)) $(($groundat-1-$offset)) $((2+($n-1)*2)) $n
  66.     done
  67. }

  68. drawdisk()
  69. ## 画一个中心在 ($1,$2),长度为 $3 的盘子
  70. ## 盘子的序号 $4 决定盘子的颜色
  71. {
  72.     disk=''
  73.     for((tmp=$3/2;tmp>0;tmp--)); do disk=${disk}')'; done
  74.     for((tmp=$3/2;tmp>0;tmp--)); do disk='('${disk}; done
  75.     tput setab $(($4%8+1))
  76.     tput cup $2 $(($1-$3/2))
  77.     echo -n "$disk"
  78.     tput sgr0
  79. }

  80. destroydisk()
  81. ## 将中心位置为 ($1,$2),长度为 $3 的盘子销毁
  82. {
  83.     tput cup $2 $(($1-$3/2))
  84.     empty=''
  85.     for((tmp=$3;tmp>0;tmp--)); do empty=' '$empty; done
  86.     echo -n "$empty"
  87.     tput cup 0 0
  88. }

  89. moving()
  90. ## 将第 $5 个盘子从 ($1,$2) 移动到 ($3,$4)
  91. {
  92.     verticaltop=$(($groundat-1-$disks))
  93.     horizspace=$(($3-$1))
  94.     x=$1
  95.     y=$2
  96.     length=$((2+($5-1)*2))

  97.     while(($y>=$verticaltop))
  98.     do
  99.         destroydisk $x $y $length
  100.         y=$(($y-1))
  101.         drawdisk $x $y $length $5
  102. #        sleep 0.5
  103.     done

  104.     sign=$(($horizspace<0?-1:1))
  105.     while(($3-$x!=0))
  106.     do
  107.         destroydisk $x $y $length
  108.         x=$(($x+1*$sign))
  109.         drawdisk $x $y $length $5
  110. #        sleep 0.5
  111.     done

  112.     while(($y<$4))
  113.     do
  114.         destroydisk $x $y $length
  115.         y=$(($y+1))
  116.         drawdisk $x $y $length $5
  117. #        sleep 0.5
  118.     done
  119. }

  120. hanoi()
  121. {
  122.     bool1=$(($disks%2))
  123.    
  124.     for((s=1;s<2**$disks;s++))
  125.     {       
  126.         index=$(factor $s | sed 's/.*: //;s/2 /2\n/g' | grep '^2$' -c)
  127.         step=$(((s/(2**$index)+1)/2))
  128.         index=$(($index+1))
  129.         bool2=$(($index%2))
  130.         fromtonum=''

  131.         ## 求出第 s 步时,应将第 $index 个盘子从底座(1或2或3)移动到底座(1或2或3)       
  132.         if(($bool1==$bool2))
  133.         then
  134.             case $(($step%3)) in
  135.                 1)
  136.                     fromtonum='1 3';;
  137.                 2)
  138.                     fromtonum='3 2';;
  139.                 0)
  140.                     fromtonum='2 1';;
  141.             esac
  142.         else
  143.             case $(($step%3)) in
  144.                 1)
  145.                     fromtonum='1 2';;
  146.                 2)
  147.                     fromtonum='2 3';;
  148.                 0)
  149.                     fromtonum='3 1';;
  150.             esac
  151.         fi
  152.         fromtonum=${fromtonum}" $index"

  153.         ## 按照盘子序号和底座序号计算出移动的源及目的的坐标 coordinate
  154.         _getcoordinat $fromtonum
  155.        
  156.         tput cup $groundat $(($colums+1+$colums/2))
  157.         tput setab 3
  158.         tput setaf 0
  159.         echo $s
  160.         tput sgr0

  161.         ## 移动盘子
  162.         moving $coordinate
  163.        
  164.     }

  165. }

  166. _getcoordinat()
  167. ## 第 $3 个盘子要从底座 $1 移动到底座 $2,据此计算出移动的源坐标和目的坐标
  168. {
  169.     case "$1" in
  170.         1)
  171.             coordinate="$sourcex $sourcey "
  172.             sourcey=$(($sourcey+1));;
  173.         2)
  174.             coordinate="$aidx $aidy "
  175.             aidy=$(($aidy+1));;

  176.         3)
  177.             coordinate="$destinationx $destinationy "
  178.             destinationy=$(($destinationy+1));;
  179.     esac

  180.     case "$2" in
  181.         1)
  182.             sourcey=$(($sourcey-1))
  183.             coordinate=${coordinate}"$sourcex $sourcey";;
  184.         2)
  185.             aidy=$(($aidy-1*$aidfirst))
  186.             coordinate=${coordinate}"$aidx $aidy"
  187.             aidfirst=1;;
  188.         3)
  189.             destinationy=$(($destinationy-1*$destinationfirst))
  190.             coordinate=${coordinate}"$destinationx $destinationy"
  191.             destinationfirst=1;;
  192.     esac

  193.     coordinate=${coordinate}" $3"
  194. }

  195. ################ 开始 #####################
  196. [[ -z "$disks" || "$disks" =~ [^[:digit:]] ]] && echo "usage: ""$usage" && exit
  197. (( $disks+2>$groundat || (2+($disks-1)*2)*3+4>$(tput cols))) && echo "screen is too small, reseize it" && exit
  198. tput clear
  199. tput civis
  200. initdraw
  201. stty -echo

  202. sleep 0.5
  203. for((i=5;i>=0;i--))
  204. do
  205.     tput cup $(($(tput lines)/2)) $(($(tput cols)/2-2))
  206.     tput setab $i
  207.     echo ' '$i' '
  208.     sleep 0.6
  209.     tput sgr0
  210.     tput cup $(($(tput lines)/2)) $(($(tput cols)/2-2))
  211.     echo '   '
  212.     sleep 0.4
  213. done
  214. tput sgr0
  215. tput cup $(($(tput lines)/2)) $(($(tput cols)/2))
  216. echo " "
  217. hanoi

  218. stty echo
  219. tput reset
  220. tput sgr0
  221. tput cup $(tput lines) 0
  222. tput cnorm
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-3-25 17:29:48 | 显示全部楼层
俺也写一个shell脚本,嘻嘻嘻嘻^_^
#/bin/bash
echo "adamzyg is a new Linuxsir!"
echo "嘻嘻嘻嘻^_^"
exit 0
回复 支持 反对

使用道具 举报

发表于 2006-3-25 21:47:34 | 显示全部楼层
Post by adamzyg
俺也写一个shell脚本,嘻嘻嘻嘻^_^
#/bin/bash
echo "adamzyg is a new Linuxsir!"
echo "嘻嘻嘻嘻^_^"
exit 0


好强的脚本阿…………
加油
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表