您的位置:首页 > 运维架构 > Shell

shell 整理(26)===大小写字母替换和随机取出一个奇数

2017-09-25 10:48 357 查看
(一)题目: 接受一个输入,如果是大写字母换成小写字母,小写字母换成大写字母。
例如:
[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 "\033[32m input word!!! \033[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
#这有一个空行


456 dsj
[root@localhost hushuai]# cat 000 | cut -c-10 | tr -d ' '|tr -s '\n'
123qwd tr -d :把每一行空格全删掉,但是每一行都有换行
o 符,以换行符为单位压缩
456dsj
[root@localhost hushuai]#
利用这个我们可以取出本机内的网卡的名称:例如

[root@localhost hushuai]# ifconfig |cut -c-10 | tr -d ' ' |tr -s '\n'
eth0
eth1
lo
[root@localhost hushuai]#

(3)grep -c grep是一行一行读取的,统计过滤到了多少行,不是多少个
例如: 
[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中任意一个字母开头
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  思考 心得 shell
相关文章推荐