`Shell`高级编程 Day02 —— Shell脚本初步入门
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                `Shell`高级编程 Day02 —— Shell脚本初步入门
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                Shell高級編程 Day02 —— Shell腳本初步入門
- Shell高級編程 Day02 —— Shell腳本初步入門 - 1.shell
- 2.shell 腳本
- 3.shell腳本在運維工作中的作用地位
- 4.腳本語言的種類 - 4.1 Shell腳本語言的種類
- 4.2 其他常用的腳本語言種類
- 4.3 Shell腳本語言的優勢
 
- 5 常用操作系統默認的Shell
- 6 Shell腳本的建立和執行 - 6.1 Shell腳本的建立
- 6.2 Shell腳本的執行
- 6.3 shell腳本開發的基本規范及習慣
 
 
1.shell
- shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋個操作系統,并處理各種各樣的操作系統的輸出結果,輸出到屏幕返回給用戶。
 
2.shell 腳本
-  1.由命令、變量和流程控制語句的組成 -  范例2-1:在Windows下利用bat批處理程序備份網站及數據庫數據的腳本。 @echo offset date=%date:~0,4%-%date:~5,2%-%date:~8,2% #<==定義時間變量。mysqldump -uroot -p123456 -A -B > D:\bak\"%date%".sql #<==備份數據庫數據rar.exe a -k -r -s -ml D:\bak\"%date%".sql.rar D:\bak\"%date%".sql #<==打包備份出來的數據庫數據del D:\bak\*.sql #<==刪除未打包的無用數據庫數據rar.exe a -k -r -s -ml D:\bak\"%date%"htdocs.rar D:\work\PHPnow\htdocs #<==打包站點目錄了的數據
-  范例2-2:清除/var/log下messages日志文件的簡單命令腳本。 # 清除日志腳本,版本 1cd /var/logcat /dev/null>messagesecho "Logs cleaned up."- 提示:/var/log/messages是Linux系統的日志文件,很重要。
- 范例2-2所示的腳本其實是有一些問題的,具體如下: - 1)如果不是root用戶,則無法執行腳本清理日志,并且會提示系統的權限報錯信息。
- 2)沒有任何流程控制語句,簡單地說就是只進行順序操作,沒有成功判斷和邏輯嚴密性。
 
 
-  范例2-3:寫一個包含命令、變量和流程控制的語言來清除/var/log下messages日志文件的Shell腳本 #!/bin/bash# 清除日志腳本,版本 2LOG_DIR=/var/logROOT_UID=0 #<==$UID為0的用戶,即root用戶# 腳本需要使用root用戶權限來運行,因此,對當前用戶進行判斷,對不合要求的用戶給出友好提示,并終止程序運行。if [ "$UID" -ne "$ROOT_UID" ] #<==如果當前用戶不是root,則不允許執行腳本。thenecho "Must be root to run this script." #<==給出提示后退出。exit 1 #<==退出腳本。fi# 如果切換到指定目錄不成功,則給出提示,并終止程序運行。cd %LOG_DIR || {echo "Cannot change to necesary directory."exit 1} # 經過上述兩個判斷后,此處的用戶權限和路徑應該就是對的了,只有清空成功,才打印成功提示。cat /dev/null>messages && {echo "Logs cleand up."exit 0 # 退出之前返回0表示成功,返回1表示失敗。}echo "Logs cleand up fail."exit 1
 
-  
-  2.編寫shell要學會類似打游戲過關的環節: - 1.第一關 必須是root才能執行腳本,否則退出。
- 2.第二關 成功切換目錄(cd /var/log),否則退出。
- 3.第三關 清理日志(cat /dev/null > messages),清理成功,在輸出。
- 4.第四關 通關了。。。(echo輸出)
 
3.shell腳本在運維工作中的作用地位
- shel腳本很擅長處理純文本類型的數據,而linux系統中幾乎所有的配置文件、日志文件(如nfs、rsync、httpd、nginx、lvs、mysql等)、多數啟動文件都是純文本類型的文件。因此,如果學好shell腳本語言,就可以利用它在linux系統中發揮巨大的作用。
4.腳本語言的種類
4.1 Shell腳本語言的種類
- Shell腳本語言是弱類型語言(無須定義變量的類型即可使用),在Unix/Linux中主要兩大類: - Bourne shell: - Bourne shell(sh)
- Korn shell(ksh)
- Bour ne Again Shell(bash)
 
- C shell: - csh
- tsch
 
 
- Bourne shell: 
- 查看系統支持的shell
4.2 其他常用的腳本語言種類
- 1 PHP語言 - PHP是網頁程序語言,也是腳本語言。它是一款更專注于Web頁面開發(前端展示)的語言,例如:wordpress、dedecms、discuz等著名的開源產品都是PHP語言開發的。用PHP程序也可以處理系統日志,配置文件等。
 
- 2 Perl語言 - Perl腳本語言比Shell腳本語言強大很多,在2010年以前很流行,它的語法靈活、復雜,在實現不同的功能時可以多種不同的方式,缺點不易讀,團隊協作困難,但它仍不失為一種很好的腳本語言,存世的大量相關程序軟件(比如,xtrabakup熱備工具,MySQL MHA集群高可用軟件等)中都有Perl語言的身影。
 
- 3.Python語言 - Python是近幾年非常流行的語言,它不但可以用于腳本程序開發,也可以實現Web頁面程序開發(例如,CMDB管理系統),甚至還可以實現軟件的開發(例如OpenStack、SaltStack都是Python語言開發的)、游戲開發、發數據開發、移動端開發。
 
4.3 Shell腳本語言的優勢
- 簡單、易用、高效的三大基本原則。
5 常用操作系統默認的Shell
- 常用的操作系統中, - Linux下默認的Shell是Bource Again shell(bash);
- Solaris和FreeBSD下默認的Shell是Bource shell(sh);
- AIX下默認的Shell是Korn Shell(ksh)
 
- 企業面試日:CentOS Linux系統默認的Shell是什么
- 通過一下方法可以查看 - 方法1: [root@localhost ~]# echo $SHELL/bin/bash
- 方法2: [root@localhost ~]# grep root /etc/passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin
- 提示:結尾的/bin/bash就是用戶登錄后的Shell解釋器
 
6 Shell腳本的建立和執行
6.1 Shell腳本的建立
[root@localhost ~]# echo "alias vi='vim'" >> /etc/profile [root@localhost ~]# tail -l /etc/profile. "$i"else. "$i" >/dev/nullfifidoneunset iunset -f pathmungealias vi='vim'[root@localhost ~]# source /etc/profile- 1.腳本開頭(第一還) - 一個規范的Shell腳本在第一行會指出由哪個程序(解釋器)來執行腳本中的內容,這一行內容在Linux bash的編程一般為: #!/bin/bash或#!/bin/sh #<==255個字符以內
- 開頭的"#!“字符又稱為幻數(其實叫什么都無所謂,知道它的作用就好),在執行bash腳本的時候,內核會根據”#!"后的解釋器來確定該用哪個程序解釋這個腳本中的內容.
- 這一行必須位于每個腳本頂端的第一行,如果不是第一行則為腳本注釋行. [root@localhost ~]# cat test.sh#!/bin/bashecho "herhan start"#!/bin/bash #<==寫到這里就是注釋了#!/bin/sh #<==寫到這里就是注釋了echo "herhan end"
 
- 2.bash與sh的區別 -  sh為bash的軟鏈接,大多數情況下,腳本的開頭使用"#!/bin/bash"和"#!/bin/sh"是沒有區別的,但更規范的寫法是在腳本的開頭使用"#!/bin/bash" [root@localhost ~]# ll /bin/shlrwxrwxrwx. 1 root root 4 Aug 23 11:43 /bin/sh -> bash[root@localhost ~]# ll /bin/bash-rwxr-xr-x. 1 root root 964608 Oct 30 2018 /bin/bash
-  下面的Shell腳本是系統的軟件啟動腳本的開頭部分 [root@localhost ~]# head -1 /etc/init.d/network #! /bin/bash
-  如果使用/bin/sh執行腳本出現異常,那么可以再使用/bin/bash試一試,但是一般不會發生此類情況 
-  一般情況下,在安裝Linux系統時會自動安裝好bash軟件,查看系統的bash版本: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) #<==這里顯示的是作者寫作的`Linux`的環境版本[root@localhost ~]# bash --versionGNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu) #<==這里顯示的是`bash`的版本Copyright (C) 2011 Free Software Foundation, Inc.#<==下面幾行是自由軟件提示的相關信息License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software; you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.
-  bash軟件曾經爆出了嚴重漏洞(破殼漏洞),憑借此漏洞,攻擊者可能會接管計算機的整個操作系統,得以訪問各種系統內的機密信息,并對系統進行更改等.任何人的計算機系統,如果使用了bash軟件,都需要打上補丁. - 檢測系統是否存在漏洞方法為: [root@localhost ~]# env x='() {:;}; echo be careful' bash -c "echo this is a test"this is a test
- 返回如下兩行,則表示需要盡快升級bash be carefulthis is a test
- 升級方法為: [root@localhost ~]# yum -y update bash[root@localhost ~]# rpm -qa bashbash-4.2.46-34.el7.x86_64
 
-  下面是Linux中常用腳本開頭的寫法 #!/bin/sh#!/bin/bash#!/usr/bin/awk#!/bin/sed#!/usr/bin/tcl#!/usr/bin/expect #<==expect解決交互式的語言開頭解釋器#!/usr/bin/perl #<==perl語言解釋器#!/usr/bin/env python #<==python語言解釋器
 
-  
- 3.腳本注釋 - 在Shell腳本中,跟在#后面的內容表示注釋,用來對腳本進行注釋說明,注釋部分不會被當作程序來執行,僅僅是給開發者和使用者看的
- 注釋可自成一行,也可以跟在腳本命令的后面與命令在同一行
 
6.2 Shell腳本的執行
- 1.執行順序 - 當Shell腳本運行時,它會先查找系統環境變量ENV,該變量指定了環境文件(加載順序通常是/etc/profile,~/.bash_profile,~/.bashrc,/etc/bashrc等)
- 在加載了上述環境變量文件后,Shell就開始執行Shell腳本中的內容 - Shell腳本是從上至下從左至右依次執行每一行的命令及語句的,即執行完了一個命令后再執行下一個,如果在Shell腳本中遇到子腳本(即腳本嵌套)時,就會先執行子腳本的內容,完成后再返回父腳本繼續執行父腳本內后續的命令及語句.
- 通常情況下,在執行Shell腳本時,會向系統內核請求啟動一個新的進程,以便在該進程中執行腳本的命令及子Shell腳本.
 
 
- 特殊技巧:設置Linux的crond任務時,最好能在定時任務腳本中重新定義系統環境變量,否則,一些系統環境變量將不會被加載,這個問題需要注意
 
- 2.Shell腳本的執行通常可以采用以下幾種方式. - 1)ash script-name或sh script-name:這是當腳本文件本身沒有可執行權限時常使用的方法,或者腳本文件開頭沒有指定解釋器時需要使用的方法。
- 2)path/script-name或./script-name:指在當前路徑下執行腳本,需要將腳本文件的權限先改為可執行。
- 3)source script-name或.script-name:這種方法通常是使用source或.(點號)讀入或加載指定的shell腳本文件,通過source或.加載執行過的腳本,由于是在當前shell中執行腳本。因此在腳本結束之后,腳本中的變量(包含函數)值在當前Shell中依然存在,而sh和bash執行腳本都會啟動新的子Shell執行,執行后退回到父Shell。source或.命令的功能是:在當前shell中執行source或.加載并執行的相關腳本文件中的命令及語句,而不是產生一個子shell來執行文件中的命令。
- 4)sh<script-name或cat scripts-name|sh:
 
6.3 shell腳本開發的基本規范及習慣
- 1)shell腳本的第一行是指定腳本解釋器,通常為: #!/bin/bash或#!/bin/sh
- 2)shell腳本的開頭會加版本、版權等信息,可修改~/.vimrc配置文件配置vim編輯文件時自動加上以上信息的功能 # Date:# Auther:# Blog:# Desciption:# Version:
- 3)在Shell腳本中盡量不用中文
- 4)Shell腳本的命名應以.sh為擴展名
- 5)Shell腳本應存放在固定的路徑下
 =習慣===
- 1)成對的符號應盡量一次性寫出來,然后退格在符號里增加內容,以防止遺漏。
- 2)對于流程控制語句,應一次性將格式寫完,載添加內容。
- 3)通過縮進讓代碼更易讀
- 4)對于常規變量的字符串定義變量值應加雙引號,并且等號前后不能有空格,需要強引用的(指所見即所得的字符引用),則用單引號(’’),如果是命令的引用,則用反引號(``).
- 5)腳本中的單引號、雙引號及反引號必須為英文狀態下的符號,其實所有的Linux字符及符號都應該是英文狀態下的符號。
總結
以上是生活随笔為你收集整理的`Shell`高级编程 Day02 —— Shell脚本初步入门的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: vscode中的中文乱码问题
- 下一篇: 用PS去除图片中文字的6个方法
