Shell俗稱(chēng)殼(用來(lái)區(qū)別于核),是指“為使用者提供操作界面”的軟件(command interpreter,命令解析器)。它類(lèi)似于DOS下的COMMAND.COM和后來(lái)的cmd.exe。它接收用戶(hù)命令,然后調(diào)用相應(yīng)的應(yīng)用程序。
一:圖形界面shell
(Graphical User Interface shell 即 GUI shell)
例如:應(yīng)用最為廣泛的Windows Explorer(微軟的Windows系列操作系統(tǒng)),還有也包括廣為人知的Linux shell,其中Linux shell包括X Window Manager(BlackBox和FluxBox),以及功能更強(qiáng)大的CDE、GNOME、KDE、 Xfce。
二:命令行式shell
(Command Line Interface shell ,即CLI shell)
例如:
sh(Bourne Shell)/csh/tcsh/bash/ksh/zsh/fish等(Unix及類(lèi)unix)
COMMAND.COM(CP/M系統(tǒng);MS-DOS、PC-DOS、DR-DOS、FreeDOS等DOS;Windows 9x)
cmd.exe/命令提示符(OS/2、Windows NT、React OS)
Windows PowerShell(支持.NET Framework技術(shù)的Windows NT)
shell腳本中最重要的就是對(duì)shell命令的使用與組合,再使用shell腳本支持的一些語(yǔ)言特性,完成想要的功能。
1、編寫(xiě) helloworld 腳本
- #!/bin/bash
- echo "hello world"
2. 通過(guò)位置變量創(chuàng)建 Linux 系統(tǒng)賬戶(hù)及密碼
- #!/bin/bash
- #$1 是執(zhí)行腳本的第一個(gè)參數(shù),$2 是執(zhí)行腳本的第二個(gè)參數(shù)
- useradd "$1"
- echo "$2" | passwd ‐‐stdin "$2"
3. 每周 5 使用 tar 命令備份/var/log 下的所有日志文件
- #vim /root/logbak.sh
- #編寫(xiě)備份腳本,備份后的文件名包含日期標(biāo)簽,防止后面的備份將前面的備份數(shù)據(jù)覆蓋
- #注意 date 命令需要使用反引號(hào)括起來(lái),反引號(hào)在鍵盤(pán)<tab>鍵上面
- tar -czf log-`date +%Y%m%d`.tar.gz /var/log
- # crontab ‐e #編寫(xiě)計(jì)劃任務(wù),執(zhí)行備份腳本
- 00 03 * * 5 /root/logbak.sh
4. 一鍵部署 LNMP(RPM 包版本)
- #!/bin/bash
- #使用 yum 安裝部署 LNMP,需要提前配置好 yum 源,否則該腳本會(huì)失敗
- #本腳本使用于 centos7.2 或 RHEL7.2
- yum ‐y install httpd
- yum ‐y install mariadb mariadb‐devel mariadb‐server
- yum ‐y install php php‐mysql
- systemctl start httpd mariadb
- systemctl enable httpd mariadb
5. 實(shí)時(shí)監(jiān)控本機(jī)內(nèi)存和硬盤(pán)剩余空間,剩余內(nèi)存小于 500M、根分區(qū)剩余空間小于 1000M時(shí),發(fā)送報(bào)警郵件給 root 管理員
- #!/bin/bash
- #提取根分區(qū)剩余空間
- disk_size=$(df / |awk '/\//{print $4}')
- #提取內(nèi)存剩余空間
- mem_size=$(free |awk '/Mem/{print $4}')
- while :
- do
- #注意內(nèi)存和磁盤(pán)提取的空間大小都是以 Kb 為單位
- if [ $disk_size ‐le 512000 ‐a $mem_size ‐le 1024000 ];then
- mail ‐s Warning root <<EOF
- Insufficient resources,資源不足
- EOF
- fi
- done
6. 腳本生成一個(gè) 100 以?xún)?nèi)的隨機(jī)數(shù),提示用戶(hù)猜數(shù)字,根據(jù)用戶(hù)的輸入,提示用戶(hù)猜對(duì)了,猜小了或猜大了,直至用戶(hù)猜對(duì)腳本結(jié)束。
- #!/bin/bash
- #RANDOM 為系統(tǒng)自帶的系統(tǒng)變量,值為 0‐32767 的隨機(jī)數(shù)
- #使用取余算法將隨機(jī)數(shù)變?yōu)?nbsp;1‐100 的隨機(jī)數(shù)
- num=$[RANDOM%100+1]
- #使用 read 提示用戶(hù)猜數(shù)字
- #使用 if 判斷用戶(hù)猜數(shù)字的大小關(guān)系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),‐lt(小于),‐le(小
- 于等于)
- while :
- do
- read ‐p "計(jì)算機(jī)生成了一個(gè) 1‐100 的隨機(jī)數(shù),你猜: " cai
- if [ $cai ‐eq $num ];then
- echo "恭喜,猜對(duì)了"
- exit
- elif [ $cai ‐gt $num ];then
- echo "Oops,猜大了"
- else
- echo "Oops,猜小了"
- fi
7. 檢測(cè)本機(jī)當(dāng)前用戶(hù)是否為超級(jí)管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不是,則提示您非管理員(使用字串對(duì)比版本)
- #!/bin/bash
- if [ $USER == "root" ];then
- yum ‐y install vsftpd
- else
- echo "您不是管理員,沒(méi)有權(quán)限安裝軟件"
- fi
8. 檢測(cè)本機(jī)當(dāng)前用戶(hù)是否為超級(jí)管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不是,則提示您非管理員(使用 UID 數(shù)字對(duì)比版本)
- #!/bin/bash
- if [ $UID ‐eq 0 ];then
- yum ‐y install vsftpd
- else
- echo "您不是管理員,沒(méi)有權(quán)限安裝軟件"
- fi
9. 編寫(xiě)腳本:提示用戶(hù)輸入用戶(hù)名和密碼,腳本自動(dòng)創(chuàng)建相應(yīng)的賬戶(hù)及配置密碼。如果用戶(hù)不輸入賬戶(hù)名,則提示必須輸入賬戶(hù)名并退出腳本;如果用戶(hù)不輸入密碼,則統(tǒng)一使用默認(rèn)的 123456 作為默認(rèn)密碼。
- #!/bin/bash
- read ‐p "請(qǐng)輸入用戶(hù)名: " user
- #使用‐z 可以判斷一個(gè)變量是否為空,如果為空,提示用戶(hù)必須輸入賬戶(hù)名,并退出腳本,退出碼為 2 #沒(méi)有輸入用戶(hù)名腳本退出后,使用$?查看的返回碼為 2
- if [ ‐z $user ];then
- echo "您不需輸入賬戶(hù)名"
- exit 2
- fi
- #使用 stty ‐echo 關(guān)閉 shell 的回顯功能
- #使用 stty echo 打開(kāi) shell 的回顯功能
- stty ‐echo
- read ‐p "請(qǐng)輸入密碼: " pass
- stty echo
- pass=${pass:‐123456}
- useradd "$user"
- echo "$pass" | passwd ‐‐stdin "$user"
10. 依次提示用戶(hù)輸入 3 個(gè)整數(shù),腳本根據(jù)數(shù)字大小依次排序輸出 3 個(gè)數(shù)字
- #!/bin/bash
- read ‐p "請(qǐng)輸入一個(gè)整數(shù):" num1
- read ‐p "請(qǐng)輸入一個(gè)整數(shù):" num2
- read ‐p "請(qǐng)輸入一個(gè)整數(shù):" num3
- #不管誰(shuí)大誰(shuí)小,最后都打印 echo "$num1,$num2,$num3"
- #num1 中永遠(yuǎn)存最小的值,num2 中永遠(yuǎn)存中間值,num3 永遠(yuǎn)存最大值
- #如果輸入的不是這樣的順序,則改變數(shù)的存儲(chǔ)順序,如:可以將 num1 和 num2 的值對(duì)調(diào)
- tmp=0
- #如果 num1 大于 num2,就把 num1 和和 num2 的值對(duì)調(diào),確保 num1 變量中存的是最小值
- if [ $num1 ‐gt $num2 ];then
- tmp=$num1
- num1=$num2
- num2=$tmp
- fi
- #如果 num1 大于 num3,就把 num1 和 num3 對(duì)調(diào),確保 num1 變量中存的是最小值
- if [ $num1 ‐gt $num3 ];then
- tmp=$num1
- num1=$num3
- num3=$tmp
- fi
- #如果 num2 大于 num3,就把 num2 和 num3 對(duì)標(biāo),確保 num2 變量中存的是小一點(diǎn)的值
- if [ $num2 ‐gt $num3 ];then
- tmp=$num2
- num2=$num3
- num3=$tmp
- fi
- echo "排序后數(shù)據(jù)為:$num1,$num2,$num3"