腳本練習

注:以下腳本練習實驗都是以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 netask && ifconfig | grep Mask || ifconfig | grep Mask | tr -s ' '|cut -d' ' -f3|cut -d':' -f2 | grep -v '127.0.0.1' | tr '\n' ' ' && ifconfig | grep netmask | tr -s ' '|cut -d' ' -f3 | 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"

1.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}}

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

2.png

2-2.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"

3.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'

4.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"

5.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"

6.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"

7.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"

8.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"

9.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:

10.png

圖2:

GIF.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"

11.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"

11-2.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"

12.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"

13.png

原創文章,作者:苦澀咖啡,如若轉載,請注明出處:http://www.www58058.com/34178

(0)
苦澀咖啡苦澀咖啡
上一篇 2016-08-15 09:22
下一篇 2016-08-15 09:22

相關推薦

  • 軟件包管理

    軟件包的分類,主要有以下兩大類    源碼包    二進制包(rpm包,系統默認包) rpm包由Redhat公司提出,被眾多linux發行版所采用。 優點:建立統一的數據庫文件,詳細記錄軟件包的安裝、卸載等變化信息,能夠自動的分析軟件包依賴關系。 查詢已安裝的rpm軟件信息: 格式:     rpm…

    Linux干貨 2016-08-25
  • 二、(3)Linux的文件與數據之:元數據

    文件的元數據 在Linux的文件系統中,數據可分為兩大類:數據和元數據 數據:泛指普通文件中的實際數據 元數據:用來描述一個文件的特征的系統數據 這樣抽象的描述并不能很清楚地表示元數據的定義,所以下面將借助stat命令進行舉例說明: stat命令 stat – display file or file system status(用于展示文件或文…

    2018-01-11
  • Linux系統命令使用格式已經如何查看幫助

    在Linux 系統中有非常多的命令一般的命令格式:“COMMAND OPTIONS ARGUMENTS” 下面有一些基礎命令可以體驗下命令的基本格式用法 ifconfig命令    作用: 配置網絡接口,查看網絡接口信息    基本語法:     ifconfig  […

    Linux干貨 2016-08-15
  • httpd服務——CentOS6

    Web Service 應用層:http,https 實現某類具體應用 傳輸層協議:TCP,UDP,SCTP IANA:          0-1023:從所周知的端口,永久的分配給固定應用使用,特權端口       &…

    Linux干貨 2016-10-09
  • 用戶,管理,權限

    主要是介紹一些 關于創建用戶 ,更改用戶信息及密碼 ,還有權限管理等等。可能介紹的不全還請大佬們多多關照新人!

    Linux干貨 2017-11-24
  • 13grep和正則表達式

    grep:Global search REgular expression and Print out the line . 文本過濾工具,根據用戶指定的模式對目標文本進行匹配檢查;打印匹配到的行。過濾即不改變原來文本數據。 grep [options] PATTERN [file…] –color=auto: 對匹配到的文本著色顯示…

    Linux干貨 2016-11-27
欧美性久久久久