使用read命令來接收輸入 使用read來把輸入值分配給一個或多個shell變量: -p:指定要顯示的提示 -t:timeout read 從標準輸入中讀取值,給每個單詞分配一個變量, 所有剩余單詞都被分配給最后一個變量 示例: read -p "Enter a filename: " File 多條件選擇if語句 選擇執行,if語句可以嵌套 格式: 單分支 if 判斷條件;then 條件為真的分支代碼 fi 雙分支 if 判斷條件;then 條件為真的分支代碼 else 條件為假的分支代碼 fi 多分支 if condition1(條件1);then if-true elif condition2;then if-true elif condition3;then if-true ... else all-false fi 逐條件進行判斷,第一次遇為"真"條件時,執行其分支,而后結束整個if語句。 條件判斷:case語句 適合離散值。 case 變量引用 in case支持glob風格的通配符 PAT1) *:任意長度任意字符 分支1 ?:任意單個字符 ;; []:指定范圍內的任意單個字符 PAT2) a|b:a或b 分支2 ;; ... *) 默認分支 ;; esac 循環語句 循環執行 將某代碼段重復運行多次 重復運行多少次: 循環次數事先已知 循環次數事先未知 有進入條件和退出條件 for,while,until for循環 for 變量名 in 列表;do 循環體 done 執行機制: 依次將列表中的元素賦值給"變量名";每次賦值后即執行一次循環體;直到列表中的元素耗盡,循環結束。 列表生產方式: 直接給出列表 整數列表 {start..end} $(seq [start[step]] end) 返回列表的命令 $(COMMAND) 使用glob,如:*.sh 變量引用 $@,$* 函數 - function(){...COMMAND} 格式 - 調用直接寫上函數名 break continue 作業
1. 編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。 ``` #/bin/bash HostInfo=`cat /etc/centos-release` HostName=`hostname` IPaddr=` ifconfig | grep "inet addr" | tr -s " " | head -1 | cut -d: -f2 | cut -d " " -f1` OSinfo=`cat /etc/centos-release` KernelInfo=`uname -r` CpuInfo=`cat /proc/cpuinfo | grep "model name" | uniq | cut -d : -f2` MemInfo=`cat /proc/meminfo | grep "MemTotal" | tr -s " "` DiskSpace=`fdisk -l | grep "Disk" | grep /dev/sda | cut -d: -f2 | cut -d , -f1` echo -e "HostInfo:\033[21;31m$HostInfo \033[0m" echo -e "HostName:\033[32m$HostName \033[0m" echo -e "IPaddr:\033[33m$IPaddr \033[0m" echo -e "OSinfo:\033[34m$OSinfo \033[0m" echo -e "KernelInfo:\033[35m$KernelInfo \033[0m" echo -e "MemInfo:\033[36m$MemInfo \033[0m" echo -e "DiskSpace:\033[41;37m$DiskSpace \033[0m" ``` 2. 編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中 > ``` > #/bin/bash > #復制目錄就在opt目錄下創建etc當天命名的文件夾 > #復制文件就在opt目錄下創建etc當天命名的文件 > BackupFile=/opt/etc`date +%F` > cp -r /etc $BackupFile && echo "/etcFile備份完成" > unset BackupFile > ``` 3. 編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值 > ``` > #/bin/bash > declare -i Use > Use=15 > Disk=`df | grep /dev/sda | tr -s " " | sort -nr -t " " -k5 | head -1 | cut -d " " -f1` > DiskuseSpace=`df | grep /dev/sda | tr -s " " | sort -nr -t " " -k5 | head -1 | cut -d " " -f5` | sed "s/\([[:digit:]]\+\).*/\1/g" > [[ "$DiskuseSpace" -gt "$Use" ]] && echo "磁盤空間不足,注意清理." && echo "空間利用率$Disk是最大值$DiskuseSpace." > unset Use > unset Disk > unset DiskuseSpace > ``` 4. 編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序 > ``` > #/bin/bash > netstat -tn | grep "tcp" | tr -s " " | cut -d " " -f5 | sed "s/\([0-1][0-9][1-9].\)\([0-1][0-9][1-9].\)\([1-9].\)\([0-1][0-9][1-9]\).*/\1\2\3\4/g" | wc -l | sort -nr > ``` 5. 寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和 > ``` > #/bin/bash > sum1=`sed -n '10p' /etc/passwd | cut -d: -f3` > sum2=`sed -n `20p` /etc/passwd | cut -d: -f3` > let sum=$sum1+$sum2 > echo "UserID sum is $sum" > ``` 6. 寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和 > ``` > #/bin/bash > echo "Give a one file Path:$1" > echo "Give a two file Path:$2" > sum1=`grep "^$" $1 | wc -l` > sum2=`grep "^$" $2 | wc -l` > let sum=$sum1+$sum2 > echo $sum > ``` 7. 寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件 > ``` > #/bin/bash > read -p "Enter your FilePath:" A B C > sum1=`ls -rA $A | wc -l` > sum2=`ls -rA $B | wc -l` > sum3=`ls -rA $C | wc -l` > let sum=$sum1+$sum2+$sum3 > echo $sum1 > echo $sum2 > echo $sum3 > echo $sum > ``` 8. 寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數 > ``` > #/bin/bash > read -p "請輸入Path:" A > [ -z "$A" ] && echo "至少應該給一個參數"&& exit 13 > [ -n "$A" ] && spaceline=`grep "^$" $A | wc -l` > echo "$spaceline" > ``` 9. 寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問” > ``` > #/bin/bash > ping -c3 $1 &> /dev/null && echo "該ip地址可以訪問" || echo "該ip地址不可訪問" > ``` 10. chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫 > ``` > #/bin/bash > read -p "Enter a file name:" File > [ -r "$File" -a -w "$File" ] && echo "此用戶可讀可寫!" || echo "此用戶不可讀且不可寫。" > ``` 11. 編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。 > ``` > #/bin/bash > #ShellName nologin.sh > Nologin=/etc/nologin > [ -e $Nologin ] && echo "已禁止普通用戶登錄!" || touch $Nologin > ``` > ``` > #/bin/bash > #ShellName login.sh > Login=/etc/nologin > [ -e $Login ] && echo "禁止普通用戶登錄文件存在。";rm $Login > ``` 12. 寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問” > ``` > #/bin/bash > #Shell name hostping > #author WZB > echo "請輸入一個IP:$1" > [[ -n "$1" ]] && echo "This IP is True!!" && ping -c3 $1 &>/dev/null && echo "$1可以訪問" || echo "$1不可以訪問" || echo "IP address is false";exit 13 > ``` 13. 計算1+2+3+...+100的值 ``` #/bin/bash #author WZB sum=0 for i in `seq 1 1 100`;do let "sum+=i" done echo "$sum" #echo {1..100} | tr " " "+" | bc ``` 14. 計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之 > ``` > #/bin/bash > #author WZB > echo "第一個參數A:$1" > echo "第二個參數B:$2" > > [[ $2 -gt $1 ]] && let sum=$2+$1 && echo "sum的值:$sum" || echo "B不大于A,已退出請重新執行。";exit3 > > unset sum > ``` ``` [[ $1 = ~\b[[:digit:]]+\b ]]匹配任意數字 ``` ``` seq -s(指定分隔符) + 1 10 ```
原創文章,作者:真的可行(wzb),如若轉載,請注明出處:http://www.www58058.com/36186