shell 整理(26)===大小写字母替换和随机取出一个奇数
(一)题目: 接受一个输入,如果是大写字母换成小写字母,小写字母换成大写字母。 例如: [root@localhost hushuai]# bash 4.sh input:dinGXUE DINgxue [root@localhost hushuai]# 方法(1) shell 代码如下: #!/bin/bash read -p "input:" dd echo $dd | tr '[a-z][A-Z]' '[A-Z][a-z]' ~ 方法(2) shell 代码如下: #!/bin/bash read -p "input word:" word [ -z $word ] && echo " 33[32m input word!!! 33[0m" a=${#word} for i in `seq $a` do b=`echo $word | cut -c$i` c=`echo $b |tr 'a-z' '1'` if [ "$c" = 1 ];then e=`echo $b |tr 'a-z' 'A-Z'` else e=`echo $b |tr 'A-Z' 'a-z'` fi echo -n $e done echo ******但是前面着两种方法也都存在各自的局限,例如: [root@localhost hushuai]# bash 3.sh input word:ding XUE 3.sh: line 4: [: ding: binary operator expected #报错;是因为我中间多了一个空格 DINGxue [root@localhost hushuai]# bash 3.sh input word:dingXUE#这样输入就完全没问题 DINGxue [root@localhost hushuai]# 这时候我们可以拓宽一下思路,如果我们把题目改掉 (1)允许用户输入的是任意字符,包括空格 (2)如果不是字母,就返回输入的值,不做任何改变 (3)如果是大写字母换成小写,小写换成大写 例如: [root@localhost hushuai]# bash 7.sh Plz Input Something:diNG %s js DIng %S JS [root@localhost hushuai]# *************非常好的一个思路 shell 代码如下: !/bin/bash swap() { a=`echo $1 | grep -c '[a-z]'` #传进来的参数能不能过滤到[a-z]任意一个 b=`echo $1| grep -c '[A-Z]'`字母,肯定在一行,所以a和b 的值不是0 if [ $a -eq 1 ];then就是1 echo -n $1 | tr 'a-z' 'A-Z' elif [ $b -eq 1 ];then#在循环里面每执行一次换一个行 echo -n $1 | tr 'A-Z' 'a-z'-n 保证在循环中不 else换行 echo -n "$1" fi } read -p "Plz Input Something:" string for i in `seq ${#string}`#输入字符串的个数,包括空格 do xxoo=`echo $string |cut -c $i` swap "$xxoo"#必须加双引号,不然空格不解析,细节问题 done echo
题目(二):一个简单随机数的应用 执行脚本后从1-100个数里面,随机弹出一个奇数。 shell 脚本代码如下: #!/bin/bash for i in `seq 100` do if [ $((i%2)) -ne 0 ];then echo $i >>123 fi done a=`cat 123 |wc -l` b=$((RANDOM%$a+1)) cat 123 | sed -n ''$b'p' 这个原理非常的简单,看到这个以后我们也可以做成一个点名册,点名册里面有很多学生的名字排成一列,例如执行一个脚本,就随机性弹出一个名字。 我对上面脚本的总结,个人心得: (1)tr 替换问题: [root@localhost hushuai]# echo ABCdSDdsff | tr '[a-zA-Z]' '[A-Za-z]' abcDsdDSFF [root@localhost hushuai]# 这么写也可以,但是你一定要注意位置,而且不加中括号也可以,例如 [root@localhost hushuai]# echo ABCdSDdsff | tr 'a-zA-Z' 'A-Za-z' abcDsdDSFF [root@localhost hushuai]# 但是不能这么写,这么写就傻逼了。。。。。。 [root@localhost hushuai]# echo ABCdSDdsff | tr 'A-Za-z' 'A-Za-z' ABCdSDdsff [root@localhost hushuai]# 还有就是如果要替换的不够了,会出现什么情况呢,就会用最后一个数或字母补齐==例如: [root@localhost hushuai]# echo {a..z} | tr 'a-z' '0-9' 0 1 2 3 4 5 6 7 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 tr 还有经常用的选项就是 tr -s 压缩 tr -d 删除 例如:看出效果了吗?就把空格全都给删除了 [root@localhost hushuai]# echo 123 456 | tr -d ' ' 123456 [root@localhost hushuai]# echo 123 456 | tr -d ' 6' #删除空格和6 12345 [root@localhost hushuai]# echo 123 456 | tr -d '6' #只删除6不删除空格 123 45 [root@localhost hushuai]# echo 123 456 | tr -d '[ 6]' #也可以这么写 12345 [root@localhost hushuai]# 例如:这样,如果文本中有多行呢? 【root@localhost hushuai]# cat 000 123 qwd 456 dsj [root@localhost hushuai]# cat 000 | cut -c-10 | tr -d ' ' #把每一行的空格删除,所以说 123qwd删除是针对每一行行内来说的 456dsj [root@localhost hushuai]# tr -s 是针对一行到另一行来说的 例如: [root@localhost hushuai]# cat 000 123 qwd #这有一个空行 o 456 dsj [root@localhost hushuai]# cat 000 | cut -c-10 | tr -d ' '|tr -s 'n' 123qwdtr -d :把每一行空格全删掉,但是每一行都有换行 o符,以换行符为单位压缩 456dsj [root@localhost hushuai]# 利用这个我们可以取出本机内的网卡的名称:例如
[root@localhost hushuai]# ifconfig |cut -c-10 | tr -d ' ' |tr -s 'n' eth0 eth1 lo [root@localhost hushuai]#
例如: [root@localhost hushuai]# echo 123 | grep -c '[0-9]' 1 [root@localhost hushuai]# echo 123 | grep -c '0-9' #必须加单引号中括号,和单引号 0 [root@localhost hushuai]# echo 123 | grep '[0-9]' 123 [root@localhost hushuai]# echo 123 | grep -o '[0-9]' #这样我们就能看出[0-9]表示 1匹配任意一个中括号里面的字母。 2 [^0-9]这样表示取反 3^[0-9]以0-9中任意一个字母开头 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |