shell編程實戰-腳本初步入門


1.什么是Shell?

Shell是一個命令解釋器,它在操作系統的最外層,負載直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕並返回給用戶。這種對話方式可以是交互的方式(從鍵盤輸入命令,可以立即得到shell的回應),或非交互式(執行腳本程序)的方式。

圖解:
1.jpg-16.1kB
  當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系統中發揮巨大的作用。
image_1b16oaub2mv9phi1bm54m314eu2a.png-119.3kB

 

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稍有不同,它還包含了cshksh的特色,但大多數腳本可以不加修改地在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腳本編程的有力支撐,特別是grepawksed等。例如:一鍵軟件安裝優化監控報警腳本,常規的業務應用,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的區別
  早期的Bashsh稍有不同,它還包含了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 .


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM