首页 > 学技术 > 技术网文 > Linux Shell > 正文

[保留] 小函数:模仿perl区间操作


来源 chinaunix.net 酷勤网整理

我们知道,perl有个区间操作符,[color=red]..[/color],例如:引用:
/home/lee#perl -e 'print a..z'
abcdefghijklmnopqrstuvwxyz/home/lee#
/home/lee#perl -e 'print A..Z,"\n"'
ABCDEFGHIJKLMNOPQRSTUVWXYZ


在shell里,同样可以实现

/home/lee#cat ch
#!/bin/bash
[[ $1 == [[:alpha:]] ]]&&[[ $2 == [[:alpha:]] ]]&&(($#==2)) || \
{ echo  "Usage:$(basename $0) <a z>/<A Z>";exit 1; }
begin=$(echo $1|od -b)
begin=${begin:8:3}
end=$(echo $2|od -b)
end=${end:8:3}
while((begin<=end));do
        [[ $begin != *[89] ]] && echo -ne "\\0$begin"
        ((begin++))
done
echo

test引用:
/home/lee#ch a z
abcdefghijklmnopqrstuvwxyz
/home/lee#ch A Z
ABCDEFGHIJKLMNOPQRSTUVWXYZ
/home/lee#ch x z
xyz
/home/lee#ch a Z #在perl里这个只打印小写26个字母
 
/home/lee#ch 1 a
Usage:ch <a z>/<A Z>
/home/lee#ch a
Usage:ch <a z>/<A Z>
/home/lee#ch , 4
Usage:ch <a z>/<A Z>
/home/lee#ch df 34
Usage:ch <a z>/<A Z>





 大蚂蚁 回复于:2005-12-26 13:06:12

你啥时候研究perl去了? shell我还搞不懂,perl我只会请人帮忙。 烈火真是博学!


汗一下,perl的一下就懂了,shell的看了好久还有点晕晕的 

是不是perl比shell简单啊?


 寂寞烈火 回复于:2005-12-26 13:09:52

引用:原帖由 大蚂蚁 于 2005-12-26 13:06 发表
你啥时候研究perl去了? shell我还搞不懂,perl我只会请人帮忙。 烈火真是博学!


汗一下,perl的一下就懂了,shell的看了好久还有点晕晕的 



shell还没吃透呢,哪有时间看别的 


 waker 回复于:2005-12-26 13:48:23

火哥,不如开个帖子把这些小片段作一个总的目录吧:mrgreen:


 寂寞烈火 回复于:2005-12-26 13:57:38

引用:原帖由 waker 于 2005-12-26 13:48 发表
火哥,不如开个帖子把这些小片段作一个总的目录吧:mrgreen: 


我是想起一出是一出,等多了之后在整理吧
好好挖掘挖掘,shell潜力大的很呢

[ 本帖最后由 寂寞烈火 于 2005-12-26 14:00 编辑 ]


 Rcfeng 回复于:2006-01-01 11:53:43

写perl命令行的时候,加一个-l吧,就不用你每句加\n了。perl的命令行基本可以涵盖甚至替代awk和sed的命令行用法,有兴趣可以看看这个 http://www-128.ibm.com/developerworks/cn/linux/sdk/perl/l-p102/index.html、http://www-128.ibm.com/developerworks/cn/linux/sdk/perl/l-p101/index.html
上面那位老兄说shell没研究透,不想看perl,呵呵,发表一下不同意见,perl在国外被誉为“瑞士军刀”,可见其功能全面和强大,很多时候可以很方便的替代shell。至少我现在基本不写超过100行的较大的shell脚本了。
现在一般linux发行版都会带perl。
这里有一本经典的perl指南,http://www.pgsqldb.org/twiki/bin/view/Perl/PerlProgramming3


 寂寞烈火 回复于:2006-01-01 12:29:34

引用:原帖由 Rcfeng 于 2006-1-1 11:53 发表
写perl命令行的时候,加一个-l吧,就不用你每句加\n了。perl的命令行基本可以涵盖甚至替代awk和sed的命令行用法,有兴趣可以看看这个 http://www-128.ibm.com/developerworks/cn/linux/sdk/perl/l-p102/inde ... 


perlline 我看过,很实用,


 寂寞烈火 回复于:2006-01-02 04:23:15


/home/lee/myfile#cat ch
#!/bin/bash
#增加了反向输出,即rev的功效
#另外加上了对非法输入的判断
#
#
(($#==2))&&( [[ $1$2 == [[:lower:]][[:lower:]] ]] || [[ $1$2 == [[:upper:]][[:upper:]] ]] )||\
{ echo  "Usage:${0##*/} <a z>/<A Z>";exit 1; }
begin=$(echo $1|od -b)
begin=${begin:8:3}
end=$(echo $2|od -b)
end=${end:8:3}
#
if [[ $begin < $end ]];then
        while((begin<=end));do
                [[ $begin != *[89] ]] && echo -ne "\\0$begin"
                ((begin++))
        done
else
        while((begin>=end));do
                [[ $begin != *[89] ]] && echo -ne "\\0$begin"
                ((begin--))
        done
fi
echo

test:引用:
/home/lee/myfile#sh ch a i
abcdefghi
/home/lee/myfile#sh ch i c
ihgfedc
/home/lee/myfile#sh ch A i
Usage:ch <a z>/<A Z>
/home/lee/myfile#sh ch A I
ABCDEFGHI
/home/lee/myfile#sh ch i C
Usage:ch <a z>/<A Z>
/home/lee/myfile#sh ch I A
IHGFEDCBA
/home/lee/myfile#sh ch a Z
Usage:ch <a z>/<A Z>
/home/lee/myfile#sh ch A Z




 王紫豪 回复于:2006-01-03 21:47:42

火哥的帖子就是好!


 王紫豪 回复于:2006-01-03 21:48:15

火哥的帖子就是好!


 __lxmxn__ 回复于:2007-05-08 13:28:08

经典,收藏了


 惠繪洋 回复于:2007-05-08 16:59:17

很好呢.. 
要收藏學習一下, 
謝烈火兄.




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=676397
转载请注明作者名及原文出处



收藏本页到: