30道shell練習題

1  先測試「/etc/vsftpd」、「/etc/hosts」是否爲目錄,並經過「$?」變量查看返回狀態值,據此判斷測試結果。mysql

[root@C6 ~]#  [ -d /etc/vsftpd ]
[root@C6 ~]# echo $?
1
[root@C6 ~]#  [ -d /etc/hosts ]
[root@C6 ~]# echo $?
1



2  測試「/media/cdrom/Server」及其父目錄是否存在,若是存在則顯示「YES」,不然不輸出任何信息。sql

[root@C6 ~]# if [ -d /media/cdrom ] && [ -f /media/cdrom/Server]; then echo "yes" ; fi


3  使用普通用戶teacher登陸,並測試是否對「/etc/passwd」文件有讀、寫權限,若是是則顯示「YES」。shell

[teacher@C6 ~]$ [ -r /etc/passwd ] && echo "yes"
yes
[teacher@C6 ~]$ [ -w /etc/passwd ] && echo "yes"


4  測試當前登陸到系統中的用戶數量是否小於或等於10,是則輸出「YES」。bash

[root@C6 ~]# [ `who | wc -l` -le 10 ] && echo "yes"
yes


5  提取出「/boot」分區的磁盤使用率,並判斷是否超過95%(爲了便於理解,操做步驟以適當進行分解)ide

[root@C6 ~]# [ `df | grep '/boot'| awk '{print $5}' | awk -F'%' '{print $1}'`  -ge 95 ] && echo "Warning"


6  提示用戶輸入一個文件路徑,並判斷是不是「/etc/inittab」,若是是 輸出「yes」函數


[root@C6 ~]# read -p "Localtion:" FIlePath
Localtion:/etc/inittab
[root@C6 ~]# [ $FIlePath = '/etc/inittab' ] && echo "yes"
yes




7  若當前環境變量LANG的內容不是「en.US」,則輸出LANG變量的值,不然無輸出。測試

[root@C6 ~]# if [ `echo $LANG` != "en.us" ] ;then echo $LANG ;fi
en_US.UTF-8

8  使用touch命令創建一個新文件,測試其內容是否爲空,向文件中寫入內容後,再次進行測試spa

[root@C6 ~]# touch 1.txt
[root@C6 ~]# [ -z 1.txt ] && echo "yes"
[root@C6 ~]# [ -z `cat 1.txt` ] && echo "yes"
yes
[root@C6 ~]# echo 123 > 1.txt
[root@C6 ~]# [ -z `cat 1.txt` ] && echo "yes"


9  測試當前的用戶是不是teacher,若不是則提示「Not teacher」命令行

[root@C6 ~]# if [ `echo $USER` != "teacher" ] ;then  echo "Not teacher";fiNot teacher


10  只要「/etc/rc.d/rc.local」或者「/etc/init.d/rc.local」中有一個是文件,則顯示「YES」,不然無任何輸出。日誌

[root@C6 ~]# [ -f /etc/rc.d/rc.local ] || [ -f /etc/init.d/rc.local ] && echo "yes"
yes


11  測試「/etc/profile」 文件是否有可執行權限,若確實沒有可執行權限,則提示「No x mode.」的信息。

[root@C6 ~]# [ ! -x  /etc/profile ] && echo "No x mode"
No x mode

12  若當前的用戶是root且使用的shell程序是「/bin/bash」, 則顯示「YES」,不然無任何輸出。

[root@C6 ~]# [ `echo $USER` == "root" ] && [ `echo $SHELL` == "/bin/bash" ] && echo "yes"
yes


13  檢查「/var/log/messages」文件是否存在,若存在則統計文件內容的行數並輸出,不然不作任何操做(合理使用變量,能夠提升編寫效率)。

[root@C6 ~]# [ -f /var/log/messages ] && echo `wc -l /var/log/messages`
6 /var/log/messages


14  提示用戶指定備份目錄的路徑,若目錄已存在則顯示提示信息後跳過,不然顯示相應提示信息後建立該目錄。

#!/bin/bash
read -p "Please import a backup dirname: " BakDir
if [ ! -d $BakDir ] 
then 
    mkdir $BakDir
fi


15 統計當前登陸到系統中的用戶數量,並判斷是否超過三個,如果則顯示實際數量並給出警告信息,不然列出登陸的用戶帳號名稱及所在終端。

#!/bin/bash
read -p "Please import a backup dirname: " BakDir
if [ ! -d $BakDir ]
then
mkdir $BakDir
fi

16  檢查portmap進程是否已經存在,若已經存在則輸出「portmap service if running.」 ;不然檢查是否存在「/etc/rc.d/init.d/portmap」 可執行腳本,存在則啓動portmap服務,不然提示「no portmap script file.」。

#!/bin/bash
Process=`ps aux | grep portmap | grep -v grep`
if [ -n $Process ] ; then
if [ ! -f /etc/rc.d/init.d/portmap ] ; then
echo "no portmap scipt file"
fi
else
echo "portmap sercice is running"
fi

17  每隔五分鐘監測一次mysqld服務進程的運行狀態,若發現mysqld進程已終止,則在「/var/log/messages」文件中追加寫入日誌信息(包括當時時間),並重啓mysqld服務;不然不進行任何操做

#!/bin/bash
Process=`ps -ef | grep "mysqld_safe" | grep -v "grep" | wc -l`
if [  $Process != 0 ] ; then
echo "Mysql Process is running"  >> /dev/null
else
echo "`date +"%Y-%m-%d %H:%M:%S"` ERROR: Mysql Process is Not running" >> /var/log/messages
/etc/init.d/mysqld start >> /dev/null
fi

*/5 * * * * /bin/bash /root/1.sh



18  依次輸出三條文字信息,包括一天中的「Moring」、「Noon」、「Evening」字串。

#!/bin/bash
for TM in "Morning" "Noon" "Evening"
do
    echo "The $TM of the day. "
done

19  對於使用「/bin/bash」做爲登陸shell的系統用戶,檢查他們在「/opt」目錄中擁有的子目錄或文件數量,若是超過100個,則列出具體數值及對應的用戶帳號

#!/bin/bash
User=`grep "/bin/bash" /etc/passwd | awk -F ':' '{print $1}'`
Number=`find /opt -user $User | grep -v ^/opt$  | wc -l`
if [  $Number -gt 100 ] ; then
echo $User:$Number
fi


20  計算「/etc」目錄中全部「*.conf」形式的配置文件所佔用的總空間大小

#!/bin/bash
FileSize=$(ls -l $(find /etc -type f -name  *.conf ) | awk '{print $5}')
total=0
for i in $FileSize
do
total=$(expr $total + $i)
done
echo "total size of conf file is $total"


21  由用戶從鍵盤輸入一個大於1的整數(如50),並計算從1到該數之間各整數的和

#!/bin/bash
sum=0
read -p "Please inport a >1 sumber : " Number
for i in $Number
do
sum=$[$Number + $i]
done
echo "Sum is $sum"


22  批量添加20個系統用戶帳號,用戶名稱依次爲「stu1」、「stu2」、「stu3」、……「stu20」,各用戶的初始密碼均設置爲「123456」


23  編寫一個批量刪除用戶的腳本程序,將上例中添加的20個用戶刪除。

#!/bin/bash
if [ $1 == "add" ] ;then
for i in `seq 1 20`
do
useradd stu$i >> /dev/null
echo 123 | passwd --stdin stu$i
echo "stu$i is create"
done
elif [ $1 == "del" ] ;then
if [  -n `grep stu /etc/passwd` ] ;then
echo "stu user is not create,please inport options add"
exit 1
else
for i in `seq 1 20`
do
userdel -r stu$i
echo "stu$i is remove"
done
fi
else
echo "Please inport options add or del"
fi



24  由用戶從鍵盤輸入一個字符,並判斷該字符是否爲字母、數字或者其餘字符,並輸出相應的提示信息。

#!/bin/bash
read -p "Please input a character: " Cha
m=`echo $Cha | sed s/[a-zA-Z]//g`
n=`echo $Cha | sed s/[0-9]//g`
s=`echo $Cha | sed s/[a-zA-Z0-9]//g`
if [ -z $m  ] ; then
echo "字母"
elif [ -z $n ] ; then
echo "數字"
elif [ -z $s ] ; then
echo "數字字母"
else
echo "your input is 特殊字符"
fi


25  編寫一個shell程序,計算多個整數值的和,須要計算的各個數值由用戶在執行腳本時做爲命令行參數給出

[root@C6 ~]# cat 1.sh
#!/bin/bash
echo $[$1+$2+3]


26  循環提示用戶輸入字符串,並將每次輸入的內容保存到臨時文件「/tmp/input.txt」中,當用戶輸入「END」字符串時退出循環體,並統計出input.txt文件中的行數、單詞數、字節數等信息,統計完後刪除臨時文件

#!/bin/bash
while true
do
read -p "Please input a string: " Str
echo $Str >> /tmp/test.txt
if [ $Str == "end" ];then
break
fi
done
wc /tmp/test.txt && rm -rf /tmp/test.txt

27  刪除系統中的stu1~stu20各用戶帳號,但stu八、stu18除外

#!/bin/bash
for i in `seq 1 20`
do
if [ $i -eq 8 ] || [ $i -eq 18 ] ; then
continue
fi
userdel -r stu$i >> /dev/nul
echo "stu$i is remove"
done


28  在腳本中定義一個help函數,當用戶輸入的腳本參數不是「start」或「stop」時,加載該函數並給出關於命令用法的幫助信息,不然給出對應的提示信息

#!/bin/bash
help() {
echo "Usage: "$0" start|stop"
}
case "$1" in
start)
echo "starting..."
;;
stop)
echo "stoping..."
;;
*)
help
esac


29  在腳本中定義一個加法函數,用於計算兩個數的和,並調用該函數分別計算12+3四、56+789的和

#!/bin/bash
sum() {
echo `expr $1 + $2`
}
sum 12 34
sum 56 789


30 從1加到100

#!/bin/bash
for i in `seq 1 100`
do
   sum=$[$sum+$i]
   echo $i
done
   echo $sum
相關文章
相關標籤/搜索