shell腳本練習題

批量修改/data/test/dir文件夾下的文件名後綴爲.log

#!/bin/bash
#
DIR=/data/test/dir
cd $DIR
for file in ;do
file_name=`echo $file | sed -nr 's#(.
)..*#\1#p'`
mv $file ${file_name}.log
echo $file is renamed ${file_name}.log
done

計算1+……100的計算結果
#!/bin/bash
#
sum=0;
for i in {1..100};do
let sum+=i;
done
echo sum is $sum

計算100以內能被3整除的數字的和
sum=0
for i in {1..100} ; do
if [ $[i%3] -eq 0 ];then
let sum+=i
fi
done
echo sum is $sum
另一種方法
#!/bin/bash
sum=0
for i in {3..100..3} ;do
let sum+=i;
done
echo "sum is $sum"

不用腳本實現方法如下:
sum=0; for i in {3..100..3};do let sum+=i; done; echo $i $sum

用for實現判斷/var目錄下所有文件的類型
#!/bin/bash
#
for i in $(find /var); do
if [ -b $i ];then
echo "$i is block device"
elif [ -c $i ]; then
echo "$i is character device"
elif [ -f $i ]; then
echo "$i is normal file"
elif [ -h $i ]; then
echo "$i is symbol link file"
elif [ -p $i ]; then
echo "$i is pipe file"
elif [ -S $i ]; then
echo "$i is socket file"
elif [ -d $i ]; then
echo "$i is directory file"
else
echo "file or directory not exist"
fi
done
exit 0

添加10個用戶user1-user10,密碼爲8爲隨機密碼
#解釋$( )等同於
tr -cd [[:alnum:]]!#@] < /dev/urandom |head -c 8
/dev/urandom表示隨機數生成命令
tr -cd [[:alnum:]]!
#@] < /dev/urandom表示從隨機數中取出包含[[:alnum:]]!#@]這些字符的內容
tr -cd [[:alnum:]]!
#@] < /dev/urandom |head -c 8表示從上面取出的內容中取頭8個字符
#!/bin/bash
for n in $(seq 1 10);do
name=user$n
useradd "$name"
echo "$(tr -cd [[:alnum:]]!_#@] < /dev/urandom |head -c 8)" |passwd --stdin $name &> /dev/null
echo "User create"
done
exit 0

在/etc/rc.d/rc3.d目錄下分別讀取每個文件,以K開頭的輸出爲文件名加stop,以S開頭的輸出爲文件名加start,如K34filename stop S66filename start(注: 和$( )效果相同)

#!/bin/bash
for i in ls /etc/rc.d/rc3.d ;do
[[ $i =~ ^K.* ]] && echo "$i stop"

    [[ $i =~ ^S.* ]] && echo "$i start"

done
另一種寫法,以忽略大小寫的方式,及k|K,s|S均可
#!/bin/bash
for i in $(ls /etc/rc.d/rc3.d | egrep -i "^k.*"); do
echo "$i stop"
done

for i in $(ls /etc/rc.d/rc3.d |grep -i "^s.*"); do
echo "$i start"
Done

計算1+..N的和,提示輸入最後的N值
#!/bin/bash
read -p "please input the last number : " N
sum=0
for i in $(seq 1 $N) ;do
let sum+=i;
done
echo sum is $sum

編寫腳本,提示請輸入網絡地址,如:192.168.0.0,判斷輸入的網段中主機在線狀態(執行後用ps aux 找到該腳本的進程號,kill 進程號,方可退出)
#!bin/bash
read -p "please input the IP,such as 192.168.0.0:" IP
net=$(echo $IP | cut -d"." -f1-2)
for i in {1..255} ; do
for j in {1..255} ; do
netip=$net.$i.$j
ping -w1 -c1 $netip &> /dev/dull && echo "$netip is up!" || echo "$netip is down!"
done
done

打印九九乘法表(\t表示橫向跳到下一個製表符位置,echo表示換行,-e表示啓用反斜槓轉義的解釋,-n表示不輸出尾隨新行)
#!/bin/bash
for i in {1..9} ; do
for j in $(seq $i) ; do
echo -en "${i}${j}=$[$i$j]\t"
done
echo
done

在/testdir目錄下創建10個html文件,文件名格式爲數字N(從1到10)加隨機8個字母,如1abcd1234.html
#解釋tr -cd [:alpha:] < /dev/random |head -c 8
/dev/random爲隨機數產生的命令
tr -cd [:alpha:] < /dev/random爲從隨機數中取出字母
tr -cd [:alpha:] < /dev/random |head -c 8,表示從取出的字母中選取頭8個字符,腳本如下
#!/bin/bash
for N in {1..10} ; do
file=$(echo "$N$(tr -cd [:alpha:] < /dev/random |head -c 8).html")
touch /data/test/dir/$file
echo "$file is created."
done

打印等腰三角形
#!/bin/bash
read -p "please input isoletes triangle: " line
for i in $(seq 1 $line) ; do
spacenum=$[$line-$i]
anum=$[2$i-1]
for j in $(seq 1 $spacenum);do
echo -e "" "\c"
done
for k in $(seq 1 $anum) ; do
echo -e "
\c"
done
echo
done

猴子吃桃,第一天摘下若干桃子,吃了一半,接着又吃一個,第二天接着吃了一半,接着又吃了一個,這樣一直到第十天,只有一個桃子,第一天一共摘了多少?
#解釋:猴子一共吃了9天桃子,反推第九天桃子數量(第十天桃子爲1+1)2,第八天桃子數量(第九天桃子+1)2,第一天桃子數量(第二天桃子+1)2,按照這個規律進行了9次。
#!/bin/bash
sum=1
for i in {1..9} ; do
let sum=(sum+1)
2
done
echo "the total peaches are : $sum"

用while實現100以內所有正奇數之和
#解釋while中用算數表達式不能用
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ] ;do
let sum=sum+i;
let i=i+2;
done
echo sum is $sum

利用while編寫腳本,提示輸入網絡地址如:192.168.0.1,判斷輸入的網段中主機在線狀態,並統計在線和離線主機各多少?
#解釋:先截取前16位地址,後16位地址構建2個嵌套循環
#!/bin/bash
read -p "please input new(eg:192.168.0.0): " net
netid=$(echo $net | cut -d. -f1-2)
i=0
up=0
down=0
while [ $i -le 254 ] ;do
j=1
while [ $j -le 254 ] ; do
if ping -c1 -w1 $netid.$i.$j &> /dev/dull ;then
echo "the $netid.$i.$j is up"
let up++
else
echo "the $netid.$i.$j is down"
let down++
fi
let j++
done
let i++
done
echo "the up is $up"
echo "the down is $down"

用while實現打印九九乘法表
#!/bin/bash
i=1
while [ $i -le 9 ] ; do
j=1
while [ $j -le $i ] ; do
let k=ij
echo -en "$i
$j=$k\t"
let j++
done
echo
let i++
done

用文件名作爲參數,統計所有參數文件的總行數

編寫函數實現兩個數字作爲參數,返回最大值
#!/bin/bash
max() {
if [ $# -ne 2 ] ;then
echo "please enter two digits"
exit 1
else
if [[ $1 =~ ^[0-9]+$ ]] && [[ $2 =~ ^[0-9]+$ ]] ; then
if [ $1 -gt $2 ];then
echo the max is $1
else
echo the max is $2
fi
else
echo "please enter legal number"
exit 2
fi
fi
}
max $1 $2

用文件名作爲參數,統計所有文件的總行數
#解釋$#表示傳遞給腳本的參數個數,算數運算格式var=$[運算表達式],等同於let var=算數表達式
#!/bin/bash
sum=0
while [ $# -gt 0 ] ; do
lines=$(cat $1 | wc -l)
shift
sum=$[$sum+$lines]
done

echo $sum

每隔3秒鐘到系統上獲取已經登錄的⽤戶的信息;如果發現⽤戶
hacker登錄, 則將登錄時間和主機記錄於⽇志/var/log/login.log中,並
退出腳本

#!/bin/bash
until false ; do
if who | grep "^hacker\>" &> /dev/null ;then
who | grep "^hacker\>" > /var/log/login.log
break
fi
sleep 3
done

編寫函數,實現取出當前系統eth0的IP地址
#!/bin/bash
eth0ip (){
ip=ifconfig ens33 |grep netmask|tr -s ' '|cut -d' ' -f3
echo ip=$ip
}
eth0ip

編寫函數,實現打印綠色和紅色FAIED
#註釋顏色起始\033[1;31m,顏色中止\033[0m,使用方法:\033[1;31m文本\033[0m,echo -e表示啓用反斜槓轉義的解釋
#!/bin/bash
redgreen(){
echo -e "\033[1;32mOK\033[0m"
echo -e "\033[1;31mFAILED\033[0m"
}
redgreen

編寫函數,實現判斷是否無位置參數,如無參數,提示錯誤
#!/bin/bash
args(){
if [ $# -eq 0 ] ; then
echo "please input a parameter!"
fi
}
args $1

shell腳本練習題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章