免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2907 | 回复: 1

小小更改,pure bash 最後一個小腳本 [复制链接]

论坛徽章:
0
发表于 2007-07-04 21:45 |显示全部楼层
大假完結,可沒什麼時間了,在學習Ruby裡胡亂寫了幾個腳本,獻醜再發一個等價
ruby 的 String#method, 寫得不好,莫見笑。
[victor@localhost ~]$ ruby -e 'puts "uNiX OpERating Os".swapcase'
UnIx oPerATING oS

#! /bin/bash
# the word which in uppercase translate to lowercase,
# lowercase to uppercase.  Usage: $0 argument
# Idea comes from ruby's String#method `swapcase', written in pure bash
# CYGWIN_NT-6.0 User-PC 1.5.24, GNU bash version 3.2.17
# Jul 3, 2007 twf_cc@yahoo.com.hk
# public domain

  # init some stuff,
  output="" ; input=$* ; ilength=${#input} ; i=0

  # function, translate uppercase ==> lowercase, lowercase ==> uppercase
  swapcase() {

              # make a loop , split the word to translate one by one
              # in old fashion style, ;(
              while [ $ilength -gt 0 ]
                do

                  # word split with ${varffset:length}
                  wsplit=${inputi:1}

                  # make single char pattern matching
                  case "$wsplit" in
                    A) wsplit=a ;; a) wsplit=A ;;
                    B) wsplit=b ;; b) wsplit=B ;;
                    C) wsplit=c ;; c) wsplit=C ;;
                    D) wsplit=d ;; d) wsplit=D ;;
                    E) wsplit=e ;; e) wsplit=E ;;
                    F) wsplit=f ;; f) wsplit=F ;;
                    G) wsplit=g ;; g) wsplit=G ;;
                    H) wsplit=h ;; h) wsplit=H ;;
                    I) wsplit=i ;; i) wsplit=I ;;
                    J) wsplit=j ;; j) wsplit=J ;;
                    K) wsplit=k ;; k) wsplit=K ;;
                    L) wsplit=l ;; l) wsplit=L ;;
                    M) wsplit=m ;; m) wsplit=M ;;
                    N) wsplit=n ;; n) wsplit=N ;;
                    O) wsplit=o ;; o) wsplit=O ;;
                    P) wsplit=p ;; p) wsplit=P ;;
                    Q) wsplit=q ;; q) wsplit=Q ;;
                    R) wsplit=r ;; r) wsplit=R ;;
                    S) wsplit=s ;; s) wsplit=S ;;
                    T) wsplit=t ;; t) wsplit=T ;;
                    U) wsplit=u ;; u) wsplit=U ;;
                    V) wsplit=v ;; v) wsplit=V ;;
                    W) wsplit=w ;; w) wsplit=W ;;
                    X) wsplit=x ;; x) wsplit=X ;;
                    Y) wsplit=y ;; y) wsplit=Y ;;
                    Z) wsplit=z ;; z) wsplit=Z ;;
                    *) wsplit=$wsplit ;;
                  esac

                  # decrease the word length after translation
                  (( ilength-- ))

                  # increase the position length to split the next char
                  (( i++ ))

                  # result storage
                  output=${output}${wsplit}
                 done

                # print result
                echo $output
              }

  # action
  swapcase "$input"

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2007-07-05 00:31 |显示全部楼层
用dd的conv以及楼主的技巧里提到的printf的用法

  1. #!/bin/bash
  2. #
  3. ucase () {
  4. echo -n $1|dd conv=ucase 2>/dev/null
  5. }
  6. lcase () {
  7. echo -n $1|dd conv=lcase 2>/dev/null
  8. }
  9. n=0
  10. str=$@
  11. echo $str|grep -q "^[[:alpha:]]\+$" || { echo InputError!;exit 1; }
  12. while((n<=${#str}));do
  13.         [[ $(printf "%d" "'${str:$n:1}") -ge 97 && $(printf "%d" "'${str:$n:1}") -le 122 ]] && \
  14.         ucase ${str:$n:1}
  15.         [[ $(printf "%d" "'${str:$n:1}") -ge 65 && $(printf "%d" "'${str:$n:1}") -le 90 ]] && \
  16.         lcase ${str:$n:1}
  17. ((n++))
  18. done
  19. echo
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP