1.什么是Shell?
Shell是一個命令解釋器,它在操作系統的最外層,負載直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕並返回給用戶。這種對話方式可以是交互的方式(從鍵盤輸入命令,可以立即得到shell的回應),或非交互式(執行腳本程序)的方式。
圖解:
當linux命令或語句不在命令行下執行(嚴格說,命令行執行的語句也是shell腳本),而是通過一個程序文件執行時,該程序就被稱為shell腳本或shell程序,shell程序很類似DOS
系統下的批處理程序。這些命令、變量和流程控制語句結合起來就形成了一個功能強大的shell腳本
。
簡單的小腳本
#!/bin/bash # 清除日志腳本, 版本 2 LOG_DIR=/var/log ROOT_UID=0 # $UID為0的時候,用戶才具有root用戶的權限 # 要使用root用戶來運行,因此,對當前用戶進行判斷,不合要求給出友好提示,並終止程序運行。 if [ "$UID" -ne "$ROOT_UID" ] then echo "Must be root to run this script." exit 1 fi # 如果切換到指定目錄不成功,給出提示,並終止程序運行。 cd $LOG_DIR || { echo "Cannot change to necessary directory." >&2 exit 1 } # 經過上述兩個判斷后,此處的用戶權限和路徑就應該是對的了,只有清空成功,才打印成功提示。 cat /dev/null > messages &&{ echo "Logs cleaned up." exit 0 # 退出之前返回0表示成功. 返回1表示失敗。 } echo "Logs cleaned up fail." exit 1
1.必須是root才能執行腳本,否則給出友好提示並終止程序運行
2.成功切換目錄(cd/var/log),否則給出友好提示並終止運行
3.清理日志(cat /dev/null >messages)清理成功,給出正確提示
4.給出相應提示(echo 輸出)
Shell腳本語言擅長處理純文本類型的數據,而linux系統中幾乎所有的配置文件、日志文件(如nfs、rsync、httpd、nginx、lvs
等)、絕大多數啟動文件純文件。就可以利用它在Linux
系統中發揮巨大的作用。
2.腳本語言類型
2.1 Shell腳本語言的種類
在UNIX/LINUX中主要由兩大類shell
1.Bourne shell
(包括sh、ksh、bash)
Bourne shell (sh) Korn shell (ksh) Bourne Again shell (bash) POSIX shell (sh)
2. Cshell (包括csh、tcsh)
C shell (csh) TENEX/TOPS C shell (tcsh)
Shell腳本語言是弱類型
語言,較為通用的shell有標准的Bourne shell
(sh)和C shell
(csh)。其中Bourne shell
(sh)已經被bash shell取代,但是我們還是習慣稱之為sh
。
查看Centos7 系統SHELL情況:
[root@node6 ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin
Linux系統中的主流shell是Bash
,它是Bourne Again Shell
的縮寫,Bash是由Bourne Shell
(sh)發展而來的,但Bash與sh稍有不同,它還包含了csh
和ksh
的特色,但大多數腳本可以不加修改地在sh
上運行
3.其他常用的腳本語句種類
3.1 PHP
PHP是網頁程序,也是腳本語言。是一款更專注於web頁面開發(前端展示)的腳本語言,例如:Dedecms,discuz。PHP程序也可以處理系統日志,配置文件等,php也可以調用系統命令。
3.2 Perl
Perl腳本語言。比shell腳本強大很多,語法靈活、復雜,實現方式很多,不易讀,團隊協作困難,但仍不失為很好的腳本語言,存世大量的程序軟件。MHA高可用Perl寫的
3.3 Python
Python,不但可以做腳本程序開發,也可以實現web程序以及軟件的開發。近兩年越來越多的公司都會要求會Python。
Shell腳本與php/perl/python語言的區別和優勢?
shell腳本的優勢在於處理操作系統底層的業務 (linux系統內部的應用都是shell腳本完成)因為有大量的linux系統命令
為它做支撐。2000
多個命令都是shell腳本編程
的有力支撐,特別是grep
、awk
、sed
等。例如:一鍵軟件安裝、優化、監控報警腳本,常規的業務應用,shell開發更簡單快速,符合運維
的簡單、易用、高效原則.
PHP、Python優勢在於開發運維工具
以及web界面
的管理工具,web業務的開發等。處理一鍵軟件安裝、優化,報警腳本。常規業務的應用等php/python
也是能夠做到的。但是開發效率和復雜
比用shell就差很多了。
4、常用操作系統的默認shell
1.Linux是Bourne Again shell(bash)
2.Solaris和FreeBSD缺省的是Bourne shell(sh)
3.AIX下是Korn Shell(ksh)
4.HP-UX缺省的是POSIX shell(sh)
提示:比較常用Bourne Again shell
(bash)
查看Centos默認bash?
[root@node6 ~]# echo $SHELL
/bin/bash
[root@node6 ~]# echo shell
shell
[root@node6 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
修改創建用戶默認配置文件路徑
[root@node6 ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
5、Shell腳本的建立和執行
5.1 shell腳本的建立
在Linux系統中,shell腳本(bash shell程序
)通常是在編輯器
(vi/vim)中編寫,由Unix/Linux
命令、bash shell
命令、程序結構控制語句和注釋等內容組成。
vi = 記事本
vim =編輯器emeditor、editplus notepad++
我們可以制作一個vi=vim的別名 [root@node6 ~]# alias vi='vim' [root@node6 ~]# vim /etc/profile export alias 'vi=vim' [root@node6 ~]# . /etc/profile
5.2 腳本開頭(第一行)
一個規范的shell腳本在腳本第一行會指出由那個程序(解釋器
)來執行腳本中的內容,這一行內容在linux bash
編程中一般為:
#!/bin/bash or #!/bin/sh <==255字符以內
其中開頭的"#!"
字符又稱為幻數
,在執行bash
腳本的時候,內核會根據"#!"
后的解釋器來確定該用那個程序解釋這個腳本中的內容。
注意:這一行必須在每個腳本頂端的第一行,如果不是第一行則為腳本注釋行。
[root@node6 tmp]# cat 1.sh #!/bin/bash echo "123" #!/bin/sh <==代表注釋 echo "456"
sh和bash的區別
早期的Bash
與sh
稍有不同,它還包含了csh和ksh的特色,但大多數腳本都可以不加修改地在sh上運行
[root@node6 /]# ll /bin/sh lrwxrwxrwx. 1 root root 4 May 1 04:26 /bin/sh -> bash [root@node6 /]# ll /bin/bash -rwxr-xr-x 1 root root 941720 Jul 24 2015 /bin/bash
企業面試題案例一:Centos Linux系統默認的shell是()
解答:bash
查看方法1:
[root@node6 ~]# echo $shell bash [root@node6 ~]# echo $SHELL /bin/bash
查看方法2:
[root@node6 ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash 提示:結尾的/bin/bash就是shell解釋器
5.3 腳本注釋
在shell腳本中,跟在(#)
井號后面的內容表示注釋
,用來對腳本
進行注釋說明,注釋部分不會被當做程序執行,僅僅給用戶看,系統解析器是看不到,更不會執行。
特別提示:注釋盡量不使用中文
5.4 Shell腳本的執行
當shell腳本運行時,它會先查找系統環境變量ENV
,改變量指定了環境文件(通常是~./bashrc,~./bash_profile,/etc/bashrc,/etc/profile等
)然后從該環境變量文件開始執行腳本,當讀取了ENV的文件后,shell才會開始執行shell腳本中的內容
特殊技巧:設置crond
任務時,最好把系統環境變量在定時腳本中重新定義,否則,一些系統環境變量不會被夾在。
Shell 腳本的執行通常可以采用以下幾種方式:
1.bash script-name或sh script-name(推薦使用) 2.path/script-name或./script-name(當前路徑下執行腳本) ###<==此項需要腳本有執行權限 3.source script-name 或. script-name #<==注意"."點號和后面字符之間有空格。 4.sh <script-name 或 cat script-name|sh(同樣適合bash)
全路徑執行如果不加命令全路徑會沒有權限
/server/scripts/abc.sh 權限不夠 /bin/sh /server/scripts/abc.sh 可以執行
提示:
第三種方法通常是使用source
或者".
"點號讀入或加載指定的shell腳本文件(如san.sh),然后,依次執行指定shell腳本文件san.sh 中的所有語句。這些語句將作為當前父shell腳本運行。
source
或者".
"點號命令的功能是在當前shell中執行source或者"."點號加載並執行相關腳本文件中的命令以及語句,而不是產生一個字shell來執行命令文件中的命令。
腳本里面的內容是無法和外面的變量溝通,但是外面的變量在腳本里面是可以引用的。
如果想在腳本里面的變量引用到命令行需要使用source or .