shell 整理(26)===大小寫字母替換和隨機取出一個奇數
(一)題目: 接受一個輸入,如果是大寫字母換成小寫字母,小寫字母換成大寫字母。
例如:
[[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
#這有一個空行
o
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)===大小寫字母替換和隨機取出一個奇數