1. 程式人生 > >shell 整理(26)===大小寫字母替換和隨機取出一個奇數

shell 整理(26)===大小寫字母替換和隨機取出一個奇數

shell  心得   思考

(一)題目: 接受一個輸入,如果是大寫字母換成小寫字母,小寫字母換成大寫字母。

例如:

[[email protected] hushuai]# bash 4.sh

input:dinGXUE

DINgxue

[[email protected] 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


******但是前面著兩種方法也都存在各自的局限,例如:

[[email protected] hushuai]# bash 3.sh

input word:ding XUE

3.sh: line 4: [: ding: binary operator expected     #報錯;是因為我中間多了一個空格

DINGxue

[[email protected] hushuai]# bash 3.sh

input word:dingXUE #這樣輸入就完全沒問題

DINGxue

[[email protected] hushuai]#


這時候我們可以拓寬一下思路,如果我們把題目改掉

(1)允許用戶輸入的是任意字符,包括空格

(2)如果不是字母,就返回輸入的值,不做任何改變

(3)如果是大寫字母換成小寫,小寫換成大寫

例如:

[[email protected] hushuai]# bash 7.sh

Plz Input Something:diNG %s js

DIng %S JS

[[email protected] 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 替換問題:

[[email protected] hushuai]# echo ABCdSDdsff | tr ‘[a-zA-Z]‘ ‘[A-Za-z]‘

abcDsdDSFF

[[email protected] hushuai]#

這麽寫也可以,但是你一定要註意位置,而且不加中括號也可以,例如

[[email protected] hushuai]# echo ABCdSDdsff | tr ‘a-zA-Z‘ ‘A-Za-z‘

abcDsdDSFF

[[email protected] hushuai]#

但是不能這麽寫,這麽寫就傻逼了。。。。。。

[[email protected] hushuai]# echo ABCdSDdsff | tr ‘A-Za-z‘ ‘A-Za-z‘

ABCdSDdsff

[[email protected] hushuai]#

還有就是如果要替換的不夠了,會出現什麽情況呢,就會用最後一個數或字母補齊==例如:

[[email protected] 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 刪除

例如:看出效果了嗎?就把空格全都給刪除了

[[email protected] hushuai]# echo 123 456 | tr -d ‘ ‘

123456

[[email protected] hushuai]# echo 123 456 | tr -d ‘ 6‘ #刪除空格和6

12345

[[email protected] hushuai]# echo 123 456 | tr -d ‘6‘ #只刪除6不刪除空格

123 45

[[email protected] hushuai]# echo 123 456 | tr -d ‘[ 6]‘ #也可以這麽寫

12345

[[email protected] hushuai]#

例如:這樣,如果文本中有多行呢?

【[email protected] hushuai]# cat 000

123 qwd

456 dsj

[[email protected] hushuai]# cat 000 | cut -c-10 | tr -d ‘ ‘  #把每一行的空格刪除,所以說

123qwd 刪除是針對每一行行內來說的

456dsj

[[email protected] hushuai]#

tr -s 是針對一行到另一行來說的

例如:

[[email protected] hushuai]# cat 000

123 qwd

#這有一個空行

456 dsj

[[email protected] hushuai]# cat 000 | cut -c-10 | tr -d ‘ ‘|tr -s ‘\n‘

123qwd tr -d :把每一行空格全刪掉,但是每一行都有換行

o 符,以換行符為單位壓縮

456dsj

[[email protected] hushuai]#

利用這個我們可以取出本機內的網卡的名稱:例如

[[email protected] hushuai]# ifconfig |cut -c-10 | tr -d ‘ ‘ |tr -s ‘\n‘

eth0

eth1

lo

[[email protected] hushuai]#


(3)grep -c grep是一行一行讀取的,統計過濾到了多少行,不是多少個

例如: 

[[email protected] hushuai]# echo 123 | grep -c ‘[0-9]‘

1

[[email protected] hushuai]# echo 123 | grep -c ‘0-9‘   #必須加單引號中括號,和單引號

0

[[email protected] hushuai]# echo 123 | grep ‘[0-9]‘

123

[[email protected] hushuai]# echo 123 | grep -o ‘[0-9]‘ #這樣我們就能看出[0-9]表示

1 匹配任意一個中括號裏面的字母。

2  [^0-9]這樣表示取反

3 ^[0-9]以0-9中任意一個字母開頭





本文出自 “IT生活” 博客,謝絕轉載!

shell 整理(26)===大小寫字母替換和隨機取出一個奇數