bash腳本練習

注:以下腳本練習實驗都是以root用戶身份執行的,若普通用戶運行需要另加相應的權限

1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。

[root@fengl bin]# vim systeminfo.sh
[root@fengl bin]# chmod u+x systeminfo.sh
[root@fengl bin]# cat systeminfo.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小
HostName=`hostname`
IpAddr=`(ifconfig|grep Mask||ifconfig|grep netmask)|tr -s ' '|cut -d ' ' -f 3|grep -o '\<[[:digit:].]\+\>'|grep -v '127.0.0.1'|tr '\n' ' '`
Version=`cat /etc/centos-release`
Kernel=`uname -r`
CPU=` lscpu | grep "Model name"|tr -s ' '|cut -d: -f2`
Mem=`free -h|grep 'Mem'|tr -s ' '|cut -d: -f2|cut -d' ' -f2`
Disk=`fdisk -l|sed -n '2p'|cut -d: -f2`
echo -e "\033[31;1mHostName\033[0m:\033[32;1m$HostName\033[0m"
echo -e "\033[31;1mIPv4Addr\033[0m:\033[32;1m$IpAddr\033[0m"
echo -e "\033[31;1mOS Version\033[0m:\033[32;1m$Version\033[0m"
echo -e "\033[31;1mKernel\033[0m:\033[32;1m$Kernel\033[0m"
echo -e "\033[31;1mCPU model name\033[0m:\033[32;1m$CPU\033[0m"
echo -e "\033[31;1mMemory\033[0m:\033[32;1m$Mem\033[0m"
echo -e "\033[31;1mDisk\033[0m:\033[32;1m$Disk\033[0m"

wKioL1ewIPuBaPVYAAA71xM3FxU772.png

2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中

[root@fengl bin]# vim backup.sh
[root@fengl bin]# chmod u+x backup.sh 
[root@fengl bin]# cat backup.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:每日將/etc/目錄備份到/root/etcYYYY-mm-dd中
BackDir="/root/etc`date +%F`"
SourceDir="/etc"
echo "正在備份/etc目錄下的文件,請等待..."
cp -a "${SourceDir}"/. "${BackDir}"
SFile="/root/.sfile`date +%F`"
BackFile="/root/.backfile`date +%F`"
echo "正在檢測備份文件,請等待..."
[[ -d "${BackDir}" ]] && ls -aR ${BackDir} > ${BackFile} && sed -i 's@'${BackDir}'@/etc@g' "${BackFile}" && ls -aR ${SourceDir} > ${SFile} && [[ "`cat ${BackFile}`" == "`cat ${SFile}`" ]] && echo "備份成功" || echo -e "\033[31;1m備份失敗,請重新備份\033[0m" && rm -f {${SFile},${BackFile}}

注:腳本中驗證備份文件功能只是爲了練習,實際上沒有多大意義

wKiom1ewISDw-ZXpAAAa-udWM9U042.png

wKioL1ewITOh1b5kAAAxzf-bhH4272.png

3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值及分區

[root@fengl bin]# vim disk.sh
[root@fengl bin]# chmod u+x disk.sh 
[root@fengl bin]# cat disk.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:顯示當前硬盤分區中空間利用率最大的值及分區
MaxNum=`df|grep "^/dev/sd"|tr -s ' '|cut -d' ' -f5|tr -d '%'|sort -nr|head -1`
Partition=`df|tr -s ' '|cut -d' ' -f1,5|grep "${MaxNum}"|cut -d' ' -f1|tr '\n' ' '`
echo -e "\033[31;1m當前硬盤分區中空間利用率最大值爲\033[0m:\033[32;1m${MaxNum}%\033[0m"
echo -e "\033[31;1m當前硬盤分區中空間利用率最大的分區爲\033[0m:\033[32;1m${Partition}\033[0m"

wKiom1ewIU2Sz1wTAAAoKQ4przk188.png

4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,並按連接數從大到小排序

[root@fengl bin]# vim links.sh
[root@fengl bin]# chmod u+x links.sh
[root@fengl bin]# cat links.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:顯示連接當前主機的每個遠程主機IPv4地址及連接數,並按連接數從大到小排序
echo -e "\t連接數\t遠程主機"
netstat -nt|grep 'tcp'|tr -s ' '|cut -d' ' -f5|cut -d: -f1|uniq -c|tr -s ' '|sort -nr|tr ' ' '\t'

wKioL1ewIWDBlfI_AAASMG6910U178.png

5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和

[root@fengl bin]# vim sumid.sh
[root@fengl bin]# chmod u+x sumid.sh
[root@fengl bin]# cat sumid.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和
Uid10th=` sed -n '10p' /etc/passwd|cut -d: -f3`
Uid20th=` sed -n '20p' /etc/passwd|cut -d: -f3`
SumUid=$[Uid10th+Uid20th]
echo -e "/etc/passwd文件中的第10個用戶和第20個用戶的ID之和爲:\033[32;1m$SumUid\033[0m"

wKiom1ewIXSDWKTgAAAYZX-wc9o199.png

6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作爲參數給腳本,計算這兩個文件中所有空白行之和

[root@fengl bin]# vim sumspace.sh 
[root@fengl bin]# chmod u+x sumspace.sh
[root@fengl bin]# cat sumspace.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:傳遞兩個文件路徑作爲參數給腳本,計算出兩個文件中所有空白行之和

#判斷是否輸入兩個參數,否則退出並提示
[[  "$#" -ge 2 ]] || echo -e "\033[31;1m請輸入兩個文件路徑作爲參數\033[0m"
[[  "$#" -ge 2 ]] || exit
#判斷參數1是否爲文件路徑,否則退出並提示
[[ -f "$1" ]] || echo -e "\033[31;1m第一個輸入的文件路徑${1}不存在,請重新輸入一個正確的文件路徑作爲參數\033[0m"
[[ -f "$1" ]] || exit
#判斷參數2是否爲文件路徑,否則退出並提示
[[ -f "$2" ]] || echo -e "\033[31;1m第二個輸入的文件路徑${2}不存在,請重新輸入一個正確的文件路徑作爲參數\033[0m"
[[ -f "$2" ]] || exit
#分別定義兩個變量記錄文件1和文件2中空白行的個數
File1Num=`grep '^$' $1| wc -l`
File2Num=`grep '^$' $2| wc -l`
#計算文件1和文件2中空白行個數之和
let Sum=${File1Num}+${File2Num}
#輸出文件1和文件2中空白行個數之和
echo -e "\033[33;1m$1和$2中所用空白行之和爲\033[0m:\033[32;1m${Sum}\033[0m"

wKiom1ewWc2DDKPmAABxnNMfMYI176.png

7、寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件

[root@fengl bin]# vim sumfile.sh
[root@fengl bin]# chmod u+x sumfile.sh
[root@fengl bin]# cat sumfile.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
EtcNum=`ls -A /etc/|wc -l`
VarNum=`ls -A /var/|wc -l`
UsrNum=`ls -A /usr/|wc -l`
Sum=$((EtcNum+VarNum+UsrNum))
echo -e "\033[31;1m/etc,/var,/usr目錄中的一級子目錄和文件共有\033[0m:\033[32;1m${Sum}\033[0m"

wKiom1ewIaXB_OuzAAAYPDCNA9I355.png

8、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作爲參數;如果參數個數小於1,則提示用戶“至少應該給一個參數”,並立即退出;如果參數個數不小於1,則顯示第一個參數所指向的文件中的空白行數

[root@fengl bin]# vim argsnum.sh
[root@fengl bin]# chmod u+x argsnum.sh
[root@liang7 bin]# cat argsnum.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:統計第一個參數路徑文件的空白行數

#判斷是否輸入參數,否則提示並退出
[[ $# -lt 1 ]] && echo -e "\033[31;1m請至少輸入一個文件路徑作爲參數\033[0m" && exit
#判斷輸入的是否文件路徑,否則提示並退出
[[  -f $1  ]] || echo -e "\033[31;1m輸入的文件路徑不存在,請在argsnum.sh後面重新輸入一個正確的文件路徑作爲參數\033[0m" 
[[  -f $1  ]] || exit
#計算第一個參數文件中空白行數
FileSpaceLineNum=`grep '^$' $1|wc -l`
#輸出第一個參數文件中空白行數
echo -e "\033[31;1m第一個參數文件中的空白行數爲\033[0m:\033[32;1m${FileSpaceLineNum}\033[0m"

wKiom1ewIdywdP5AAABWVYlIYUw590.png

9、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做爲參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”

[root@fengl bin]# vim hostping.sh
[root@fengl bin]# chmod u+x hostping.sh
[root@fengl bin]# cat hostping.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:輸入一個IPv4地址作爲參數,測試是否能夠ping通並提示

#判斷有無參數,若無參數則提示並退出
[[ -z $@ ]] && echo -e "\033[31;1m請輸入一個IPv4地址作爲參數\033[0m" && exit
#判斷是否只有一個參數,如果有多個參數則提示並退出
[[ $# -gt 1 ]] && echo -e "\033[31;1m只能輸入一個參數作爲IPv4地址\033[0m" && exit
#判斷參數是否爲有效的IPv4地址,若不是則提示並退出
echo "$1"|grep -E '^([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' &> /dev/null || echo -e "\033[31;1m請輸入一個正確的IPv4地址\033[0m"
echo "$1"|grep -E '^([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' &> /dev/null || exit
#ping該IPv4地址,並反饋結果
echo -e "\033[31;1m正在 ping "$1",請等待...\033[0m"
ping -c2 -W2 "$1" &> /dev/null && echo -e "\033[32;1m主機"$1"可訪問\033[0m" || echo -e "\033[31;1m主機"$1"不可訪問\033[0m"

wKioL1ewIg2SvS66AACBGPZY6y4176.png

10、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫(因考慮到普通用戶調用該腳本權限問題,故將腳本路徑放到了/tmp/目錄下,並且該腳本還可以判該文件的其他權限)

[root@fengl tmp]# vim per.sh 
[root@fengl tmp]# chmod 745 per.sh
[root@fengl tmp]# cat per.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:判斷當前用戶對某文件的讀、寫、執行權限並提示

#定義要檢測文件的路徑變量並賦值
SourceFile=/tmp/file1
#定義要檢測文件的權限變量並賦值
[[ -r "${SourceFile}" ]]
Read=`echo $?`
[[ -w "${SourceFile}" ]]
Write=`echo $?`
[[ -x "${SourceFile}" ]]
Execute=`echo $?`
#檢測當前用戶對該文件的讀、寫、執行權限
[[ "${Read}" -eq 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[32;1m當前用戶對${SourceFile}文件有讀、寫、執行權限\033[0m"
#檢測當前用戶對該文件的讀、寫權限
[[ "${Read}" -eq 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[34;1m當前用戶對${SourceFile}文件有讀、寫權限\033[0m"
#檢測當前用戶對該文件的讀、執行權限
[[ "${Read}" -eq 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[34;1m當前用戶對${SourceFile}文件有讀、執行權限\033[0m"
#檢測當前用戶對該文件的寫、執行權限
[[ "${Read}" -gt 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[33;1m當前用戶對${SourceFile}文件有寫、執行權限\033[0m"
#檢測當前用戶對該文件的讀權限
[[ "${Read}" -eq 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[34;1m當前用戶對${SourceFile}文件只有讀權限\033[0m"
#檢測當前用戶對該文件的寫權限
[[ "${Read}" -gt 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[33;1m當前用戶對${SourceFile}文件只有寫權限\033[0m"
#檢測當前用戶對該文件的執行權限
[[ "${Read}" -gt 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[33;1m當前用戶對${SourceFile}文件只有執行權限\033[0m"
#檢測當前用戶對該文件無任何權限
[[ "${Read}" -gt 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[31;1;5m當前用戶對${SourceFile}文件無任何權限\033[0m"

下面圖1是root用戶更改file1權限的截圖,圖2是普通用戶針對file1文件不同權限的測試結果截圖

圖1:

wKiom1ewIi3TDYNyAAARAqaJd_Y837.png

圖2:

wKioL1ewIlfiDLpeAABYPVF6ZX0619.gif

11、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。

[root@fengl bin]# vim nologin.sh 
[root@fengl bin]# chmod u+x nologin.sh
[root@fengl bin]# cat nologin.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:禁止普通用戶登錄

#檢測/etc目錄下有無nologin文件,並定義回執變量
[[ -f /etc/nologin ]]
EtcReturnNum=`echo $?`
#檢測/run目錄下有無nologin文件,並定義回執變量
[[ -f /run/nologin ]]
RunReturnNum=`echo $?`
#禁止普通用戶登錄
[[ ${EtcReturnNum} -eq 0 ]] || [[ ${RunReturnNum} -eq 0 ]] && echo -e "\033[31;1m已禁止普通用戶登錄該系統\033[0m" && exit
[[ $"EtcReturnNum" -gt 0 ]] && [[ $"RunReturnNum" -gt 0 ]] && touch /etc/nologin && echo -e "\033[31;1m已禁止普通用戶登錄該系統\033[0m"

wKioL1ewImfAvg14AABFYU-ECiU121.png

[root@fengl bin]# vim login.sh 
[root@fengl bin]# chmod u+x login.sh
[root@fengl bin]# cat login.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:允許普通用戶登錄

#檢測/etc目錄下有無nologin文件,並定義回執變量
[[ -f /etc/nologin ]]
EtcReturnNum=`echo $?`
#檢測/run目錄下有無nologin文件,並定義回執變量
[[ -f /run/nologin ]]
RunReturnNum=`echo $?`
#允許普通用戶登錄
[[ $"EtcReturnNum" -eq 0 ]] && rm -f /etc/nologin
[[ $"RunReturnNum" -eq 0 ]] && rm -f /run/nologin
echo -e "\033[32;1m已允許普通用戶登錄該系統\033[0m"

wKiom1ewInegjgwsAABZ5wQNkW0066.png

12、計算1+2+3+...+100的值

[root@fengl bin]# vim sum.sh
[root@fengl bin]# chmod u+x sum.sh
[root@fengl bin]# cat sum.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:計算1~10的和

#指定數字範圍變量
Num=`echo {1..100}`
#計算求和
#方法一:
#let sum=`echo $Num | tr -t ' ' '+'`
#方法二:
#sum=$[`echo $Num | sed 's@[[:space:]]@+@g'`]
#方法三:
#sum=$((`seq 1 100 | tr -t '\n' '+'|sed 's@+$@@'`))
#方法四:
#sum=$(expr `seq 1 100|tr -t '\n' '+'|sed 's@+@ + @g'|sed 's@ + $@@'`)
#方法五:
sum=`echo $Num|tr -t ' ' '+'|bc`
echo -e "\033[32;1m1~100的和爲\033[0m:\033[33;1m${sum}\033[0m"

wKiom1ewIpLidQMFAAAQyvEbwGs149.png

13、計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大於A,否提示錯誤並退出,是則計算之

[root@fengl bin]# vim parametersum.sh 
[root@fengl bin]# chmod u+x parametersum.sh 
[root@fengl bin]# cat parametersum.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:計算該腳本第一個參數中所有數字和第二個參數中的所有數字之和,並判斷第二個參數中所有數字之和是否大於第一個參數中所有數字之和,是則計算,否則提示錯誤並退出

#檢測是否有參數
[[ $# -ge 2 ]] || echo -e "\033[31;1m請至少輸入兩個帶有數字的參數\033[0m"
[[ $# -ge 2 ]] || exit
#檢測參數知否有效
echo $1|grep '[0-9]\+' &> /dev/null || echo -e "\033[31;1m參數${1}無效,請重新輸入\033[0m"
echo $1|grep '[0-9]\+' &> /dev/null || exit
echo $2|grep '[0-9]\+' &> /dev/null || echo -e "\033[31;1m參數${2}無效,請重新輸入\033[0m"
echo $2|grep '[0-9]\+' &> /dev/null || exit
#分別取出第一個參數和第二個參數中的所有數字,並分別計算每個參數中的數字之和
NumA=`echo $1 | grep -o '[0-9]\+'|tr -d '\n'`
NumB=`echo $2 | grep -o '[0-9]\+'|tr -d '\n'`
SumA=$[`echo ${NumA} | sed 's@[0-9]@&+@g' | sed 's@+$@@'`]
SumB=$[`echo ${NumB} | sed 's@[0-9]@&+@g' | sed 's@+$@@'`]
#檢測第二個參數中的數字之和是否大於第一個參數中的數字之和
[[ ${SumB} -gt ${SumA} ]] || echo -e "\033[31;1m第二個參數中數字之和小於或等於第一個參數中的數字之和,請重新輸入\033[0m"
[[ ${SumB} -gt ${SumA} ]] || exit
#計算兩個參數中的所有數字之和
SumAB=$[SumA+SumB]
echo -e "\033[33;1m兩個參數中所有數字之和爲\033[0m:\033[32;1m${SumAB}\033[0m"

wKiom1ewIrGCws3EAAB3WyI25dY267.png

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