Linux中編寫Shell腳本

2022-01-05 謝公子學安全

目錄

Shell

Shell腳本的執行

Shell腳本編寫規範

Shell 中的變量

變量的算術運算

雙小括號 (())  數值運算命令的用法

let 運算命令的用法

expr 命令的用法

br 命令的用法

$[] 符號的運算示例

Shell腳本的條件測試

幾種條件測試語句

文件測試操作符

字符串測試操作符

整數二元比較操作符

邏輯操作符

測試表達式 test 、[] 、[[]] 、 (()) 的區別

if 條件判斷語句

case 條件判斷語句

for循環語句

while循環語句

Break、Continue、exit 循環控制語句

Shell腳本執行scrapy爬蟲和python腳本

Shell是一個命令解釋器,它的作用是解釋執行用戶輸入的命令及程序等。用戶每輸入一條命令,Shell就執行一條。這種從鍵盤輸入命令,就可以立即得到回應的對話方式,稱為交互的方式。

當命令或程序語句不在命令行下執行,而是通過一個程序文件來執行時,該程序文件就被稱為Shell腳本。在Shell腳本裡內置了很多命令、語句及循環控制,然後將這些命令一次性執行完畢,這種通過文件執行腳本的方式稱為非交互的方式。Shell腳本語言很適合用於處理純文本型的數據,而Linux系統中幾乎所有的配置文件、日誌文件,以及絕大對數的啟動文件都是純文本類型的文件。


Shell 腳本的類型

Shell腳本語言是弱類型語言(無須定義變量的類型即可使用),在Unix/Linux中主要有兩大類shell: 一類是 Bourne  shell ,另一類是 C shell

Bourne shell 包括 Bourne shell (sh)、Korn shell(ksh)、Bourne Again Shell 三種類型。

C shell包括csh、tcsh兩種類型

查看系統默認的shell:echo $SHELL

查看系統支持的shell:cat /etc/shells




Shell腳本的執行通常可以採用以下幾種方式。


1、bash script-name 或 sh script-name   這是當腳本文件本身沒有執行權限時常使用的方法


2、path/script-name 或./script-name  在當前路徑下執行腳本,需要將腳本文件的權限改為可執行。然後使用腳本的絕對路徑或相對路徑就可以直接執行腳本了。


3、source script-name 或 . script-name 這種方法通常是使用source或 「.」(點號)讀入或加載指定的Shell腳本文件,然後依次執行指定的Shell腳本中的語句。這些語句將在當前父 shell 腳本進程中執行(其他幾種模式都會啟用新的進程執行該腳本進程)。


Shell腳本的開發規範及習慣非常重要,雖然這些規範不是必須要遵守的,但有了好的規範和習慣,可以大大提升開發效率,並能在後期降低對腳本的維護成本。


1、一個規範的Shell腳本在第一行會指出由哪個程序(解釋器)來執行腳本中的內容,這一行內容在Linux bash的編程一般為:#!/bin/bash 或 #! /bin/sh   bash 與 sh 的區別, sh 為 bash的軟連接,大多數情況下,腳本使用「#!/bin/bash」和「#!/bin/sh」是沒有區別的,但更規範的寫法是在腳本的開頭使用  #!/bin/bash


2、在shell腳本中,跟在 # 後面的內容表示注釋,用來對腳本進行注釋說明,注釋部分不會被當做程序來執行,僅僅是給開發者和使用者看的,系統解釋器是看不到的,更不會執行。注釋可以自成一行,也可以跟在腳本命令的後面與命令在同一行。注釋儘量不要使用中文,在腳本中最好也不要有中文。


3、Shell腳本的開頭會加版本、版權等信息


# Date:16:29 2018-10-20 

# Author: Create by xiaoxie

# Description: This script function is …… 

# Version:1.1

4、在shell腳本中儘量不用中文注釋,儘量用英文注釋,防止本機或切換系統環境後中文亂碼的困擾。


5、Shell腳本的命名應以.sh為擴展名 例如:1.sh


6、成對的符號應儘量一次性寫出來,然後退格在符號內增加內容,以防止遺漏。這些成對的符號包括:{}、[]、『』、「」 等


7、中括號[]兩端至少要有1個空格,因此,鍵入中括號時即留出空格[  ],然後在退格鍵入中間內容,並確保兩端都至少由一個空格。


8、對於流程控制語句,應一次性將格式寫完,再添加內容。如:一次性完成for循環語句的格式



9、通過縮進讓代碼更易讀,如:


if 條件內容     

       then         

            內容 

fi 


10、對於常規變量的字符串定義變量值應加雙引號,並且等號前後不能有空格,需要強引用的,則用單引號(『』),如果是命令的引用,則用反引號(``)。



11、腳本中的單引號、雙引號及反引號必須為英文狀態下的符號。



簡單地說,變量就是用一個固定的字符串(也可能是字符、數字等的組合)代替更多、更複雜的內容,該內容裡可能還會包含變量、路徑、字符串等其他內容。變量是暫時存儲數據的地方及數據標記,所存儲的數據存在於內存空間中,通過正確地調用內存中變量的名字就可以讀取出與變量對應的數據。


變量的賦值方法為:先寫變量名稱,緊接著是 "=" ,最後是值。中間無任何空格。通過echo命令加上 $變量名,即可輸出變量的值。雙引號,以防止出錯變量的值一般要加上。


定義變量時變量名建議用大寫,如 A=xie   B=99


read  -p  「提示信息」  變量名   #交互式賦值方法


查看變量內容 echo A 或 echo {A}



賦值時使用引號的作用




位置參數

位置參數是一種在調用 Shell 程序的命令行中按照各自的位置決定的變量,是在程序名之後輸入的參數。位置參數之間用空格分隔,Shell取第一個位置參數替換程序文件中的 1,第二個替換 2 , 依次類推。0 是一個特殊變量,它的內容是當前這個shell程序的文件名,所以 0 不是一個位置參數。

假如我現在有一個 1.sh腳本文件,內容如下

#! /bin/bash

echo $1

echo $(($2+$3))

當我執行時,我在文件名後加3個參數


預定義變量

預定義變量和環境變量相類似,也是在Shell一開始就定義的變量,不同的是,用戶只能根據shell的定義來使用這些變量,所有預定義變量都是由符號「$」和另一個符號組成。常見的Shell預定義變量有以下幾種。


假如我現在有一個 1.sh腳本文件,內容如下


#! /bin/bash

echo $1

echo ${2}+${3}

echo $#             #列印出位置參數的數量

echo $*             #列印出位置參數的內容

echo $?             #列印出命令執行後返回的狀態

echo $$             #列印出當前進程的進程號

echo $0             #列印出當前進程的進程名

當我執行時,我在文件名後加3個參數




Shell中常見的算術運算符



Shell 中常見的算術運算命令



雙小括號 (()) 數值運算命令的用法


雙小括號 (()) 的作用是進行數值運算與數值比較,它的效率很高,用法靈活,是Linux下常用的運算操作符。其操作方法如下:




let 運算命令的用法

let運算命令的語法格式為:let 賦值表達式  


let 賦值表達式的功能等同於「((賦值表達式))」 範例:給變量 i 加8



expr 命令的用法


1、expr 用於運算   

     語法:expr 表達式   

     範例:expr 2 + 2 ; expr 2 – 2 ; expr 2 * 2 ; expr 2 / 2    

     注意:運算符號和數字之間要有空格!!



2、expr配合變量計算


expr在Shell中可配合變量進行計算,但需要用反引號將計算表達式括起來。



3、利用 expr 計算字符串的長度



bc 命令的用法


bc 是UNIX/Linux下的計算器,除了作為計算器來使用,還可以作為命令行計算工具使用


交互模式 在shell命令行直接輸入 bc 及能進入bc語言的交互模式



bc也可以進行非交互式的運算,方法是與 echo 一起使用,所以我們就可以寫在腳本裡面



$[] 符號的運算示例




通常,在shell的各種條件結構和流程控制結構中都要進行各種測試,然後根據測試結果執行不同的操作,有時候也會與 if 等條件語句相結合,來完成測試判斷,以減少程序運行錯誤。


幾種條件測試語句



文件測試操作符#常用文件測試操作符說明1-d , d的全拼為 directory文件存在且為目錄則為真2-f,  f的全拼為 file文件存在且為文件則為真3-e, e的全拼為 exists文件存在則為真4-s, s的全拼為 size文件存在且大小不為0則為真5-r ,r的全拼為 read文件存在且可讀則為真6-w ,w的全拼為write文件存在且可寫則為真7-x ,x的全拼為executable文件存在且可執行則為真8-L ,L的全拼為link文件存在且為連結文件則為真9f1 -nt f2 ,nt的全拼為 newer than

文件f1比文件f2新則為真

10f1 -ot f2 ,ot的全拼為older than

文件f1比文件f2舊則為真

註:(())不能用於文件測試,文件測試一般常用的是 []


字符串測試操作符#常用字符串測試操作符說明1-n若字符串長度不為0,則為真2-z若字符串長度為0,則為真3「字符串1」 == 「字符串2」若字符串1等於字符串2,則為真4「字符串1」 != 「字符串2」若字符串1不等於字符串2,則為真

註:== 和 != 兩端要有空格 ,(())不能用於字符測試



整數二元比較操作符
在[]以及test中使用的比較符號在(())和[[]]中使用的比較符號說明-eq== 或 =相等,全拼為 equal-ne!=不相等,全拼為 not    equal-gt>大於,全拼為 greater  than-ge>=大於等於,全拼為      greater equal-lt<小於,全拼為 less       than-le<=小於等於,全拼為 less equal

"="和"!="也可以在[]中作比較使用,但在[]中使用包含"<"和">"的符號時,需要用反斜線轉義,有時不轉義雖然語法不會報錯,但是結果可能不對。

也可以在[[]]中使用包含「-gt」和「-lt」的符號,但是不建議使用

比較符號兩端也要有空格,[] (()) [[]] 兩端都要有空格


邏輯操作符在[]以及test中使用的比較符號在(())和[[]]中使用的比較符號說明-a&&and ,與,兩端都為真,才為真-o||or ,或, 兩端有一個為真,就為真!!not ,非, 兩端相反,則結果為真


測試表達式 test 、[] 、[[]] 、 (()) 的區別


#####單條件判斷##############

if  條件判斷

  then 

      命令

else

      命令

fi

#或

if  條件判斷;then 

     命令

else

     命令

fi


###雙條件判斷#####

if 條件判斷

  then

      命令

elif 條件判斷

  then 

      命令

else

   命令

fi

##或

if 條件判斷;then

    命令

elif 條件判斷;then 

    命令

else

    命令

fi


if語句對於字符串的匹配



case條件語句相當於多分支的if/elif/ellse條件語句,但是它比這些條件語句看起來更規範更工整,常被應用於實現系統服務啟動腳本等企業應用場景中。


case  變量  in

        one)

            命令

;;

        two)

             命令

;;

         *) 

             命令

esac


for  條件

do

   命令

done

##或

for  條件;do

   命令

done





Break、Continue、exit 循環控制語句


break 、continue在條件語句及循環語句(for、while、if等)中用於控制程序走向;而exit則用於終止所有語句並退出當前腳本。


#命令說明1break  n如果省略 n ,則表示跳出整個循環,n 表示跳出循環的成熟2continue n如果省略 n ,則表示跳過本次循環,忽略本次循環的剩餘代碼,進行循環的下一次循環。n表示退到第 n 層繼續循環3exit n退出當前 shell 程序,n 為上一次程序執行的狀態返回值。n 也可以省略,在下一個 shell 裡可通過 $? 接收 exit n 的n值


Shell腳本執行scrapy爬蟲和python腳本


#! /bin/bash

cd /opt/project/

scrapy crawl xx

python3 test.py


相關文章:

Linux中sed工具的使用

Linux中grep工具的使用

Linux中awk工具的使用

Linux中正則表達式和字符串的查詢、替換(tr/diff/wc/find)





相關焦點

  • Linux——Shell腳本的應用1(基礎)
    Shell腳本的應用(基礎)簡介:隨著linux系統在企業中的應用越來越多,伺服器的自動化管理也變得越來越重要。在linux伺服器的自動化維護工作中,除了計劃任務的設置以外,shell腳本的應用也是非常重要的一部分。
  • Linux中Shell腳本基礎筆記
    shell腳本都是以"#!"作為開頭。這是腳本開始的標記,它是告訴linux系統執行該腳本文件需要使用相應的解釋器,緊挨著的/bin/bash指定了解釋器的具體路徑。shell主要用#作為注釋標記。後面可以加腳本的注釋,建議寫shell腳本要根據情況多寫注釋,便於以後腳本的維護。shell腳本的運行方式:1、可以在shell腳本第一行加上"#!/bin/bash"的話。可以按照以下方式執行:bash test.sh #要保證目錄中存在該腳本文件。2、給腳本加上可執行的權限,然後使用".
  • 編寫可靠Linux shell腳本的八個建議
    帶上shellcheck好了,現在我已經有了三行(樣板)代碼,具體的業務邏輯一行都沒寫呢。是不是該開始寫了?且慢!工欲善其事,必先利其器。這次,我就介紹一個 shell 腳本編寫神器:shellcheck說來慚愧,雖然寫了幾年 shell 腳本,有些語法我還是記不清楚。這時候就要依仗 shellcheck 指點一下了。
  • 編寫Linux Shell腳本的最佳實踐
    這裡還尤其需要注意一點,就是當我們是在windows下用utf-8編碼來寫shell腳本的時候,一定要注意這個utf-8是否是有BOM的。默認情況下windows判斷utf-8格式是通過在文件開頭加上三個EF BB BF字節來判斷的,但是在Linux中默認是無BOM的。
  • Linux常用Shell腳本,值得學習及收藏
    在運維中,尤其是linux運維,都知道腳本的重要性,腳本會讓我們的 運維事半功倍,所以學會寫腳本是我們每個linux運維必須學會的一門功課,這裡收藏
  • Linux常用Shell腳本知多少
    在運維中,尤其是linux運維,都知道腳本的重要性,腳本會讓我們的 運維事半功倍,所以學會寫腳本是我們每個linux運維必須學會的一門功課,這裡收藏linux運維常用的腳本。如何學好腳本,最關鍵的是就是大量的練習 和實踐。根據以下腳本我們可以拓展,這樣我們提高的很快!舉一反三!小夥伴要是不熟悉linux的話可以在公眾號內回復 「linux」 獲取linux的教程 之後咱們再來回過頭來學一學腳本1.用Shell編程,判斷一文件是不是字符設備文件,如果是將其拷貝到 /dev 目錄下。
  • Linux下高效編寫shell腳本的10個建議
    shell腳本的編寫應該是一個必備的基本技能了,本文將分享 10 個寫出高效可靠的 shell腳本的實用技巧本文主要內容來源於《10 Useful Tips for Writing Effective Bash Scripts in Linux》,再加上自己的一點理解而成。
  • linux shell 腳本入門
    Linux 腳本編寫基礎1.1 語法基本介紹1.1.1 開頭程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。當編輯好腳本時,如果要執行該腳本,還必須使其可執行。
  • 玩轉Linux - shell 編程基礎(一)
    很多時候伺服器都需要編寫一些計劃任務來定時運行的,所以掌握一些基本的 shell 編程基礎很有必要。本文是我在網上收集的一些資料,主要目的是幫助自己更好的了解掌握 shell 編程的一些基礎知識。什麼是Shell腳本示例看個例子吧:#!
  • Linux 中實用的 4種 shell 腳本查看網站是否正常
    linux系統運維過程中,經常會遇到些問題,有時候問題會比較麻煩,此時shell腳本的優勢就體現出來,下面我來介紹幾種查看網站是否正常的shell腳本。文內含長段代碼可複製可往左滑,希望對大家有幫助!#!
  • shell腳本極簡教程
    沒有一個大公司不要求linux的基本技能的,只是不同崗位要求掌握的程度不同。Shell本身是一個用C語言編寫的程序,它是用戶使用Unix/Linux的橋梁,用戶的大部分工作都是通過Shell完成的。Shell既是一種命令語言,又是一種程序設計語言。
  • 什麼是Shell腳本?為什麼要學習Shell?
    Shell腳本語言是實現Linux/UNIX系統管理及自動化運維所必備的重要工具, Linux/UNIX系統的底層及基礎應用軟體的核心大都涉及Shell腳本的內容。每一個合格 的Linux系統管理員或運維工程師,都需要能夠熟練地編寫Shell腳本語言,並能夠閱 讀系統及各類軟體附帶的Shell腳本內容。
  • Linux命令行與Shell腳本編程學習筆記20
    trap命令允許你來指定shell腳本要觀察哪些linux信號並從shell中攔截。如果腳本收到了trap命令中列出的信號,它會阻止它被shell處理,而在本地處理它。2. trap命令的格式是: trap commands signals3. 當&符放到命令後時,它會將命令和bash shell分離開來,並將它作為系統上的獨立後臺進程運行。
  • 《Linux shell腳本攻略》限免
    任何初學者都可以在網上輕鬆獲取Linux、Linux shel相關的基礎教程,而就如何運用shell來解決現實世界中的問題,相關的知識和技巧大多都散落在論壇或博客中,要麼不夠全面系統,要麼不易查找。如果你也有此煩惱,不如看看《Linux shell腳本攻略》這本書。
  • Linux作業系統之Shell程序設計
    用Shell語言編寫的Shell程序可以使用各種變量、參數和控制結構來組織命令流程,自動化地完成各種複雜冗繁的處理工作。Linux系統中廣泛使用了Shell程序來實現系統的初啟、配置、管理和維護等工作。因此,熟練掌握Shell語言可以更加深入地理解系統的運行機制,更加有效地使用和管理系統。
  • linux系統shell腳本基本及變量
    shell是啥1、腳本語言,可以用來編寫腳本。shell script shell腳本(劇本),面向過程的語言。腳本-->一條條命令的羅列。[]括號中是字符集合,不管字符集合中有多少個字符,只匹配字符集合中的一個字符。[abc][abc] aa ab ac ba bb bc ca cb cc# touch a{a,b,c,d}.txt# ls a[abc].txt[-]-表示範圍。
  • Linux shell腳本編程入門系列一:認識shell腳本
    1、什麼是shell腳本將多個shell命令按語法組合在一起,並保存在文本文件中即得到我們所說的shell腳本(shell script)。shell腳本可以方便地與系統交互,完成系統管理以及批處理任務。shell處於作業系統與應用之間,起到橋梁的作用。
  • 乾貨 | Linux基本技能—Shell精簡教程
    Shell腳本和程式語言很相似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不需要編譯,Shell程序從腳本中一行一行讀取並執行這些命令,相當於一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。Shell初學者請注意,在平常應用中,建議不要用root帳號運行Shell 。
  • Linux—shell腳本實例進階篇
    刪除用戶1.編寫腳本:[root@localhost mnt]#!1.編寫腳本:[root@foundation71 mnt]#!實驗三編寫腳本,當執行腳本host_ping.sh時,ping各個主機IP ,ping通,顯示該IP的 hostname以及IP ,不能 ping 通,報錯並顯示 IP。
  • Linux——Shell腳本中自定義變量的應用(基礎)2
    Shell腳本的應用2(基礎)簡介:這篇文檔為shell腳本變量的應用,詳細講解了自定義變量上篇文檔的連結地址:Linux——Shell腳本的應用1(基礎),也是shell腳本的基礎內容,可以通過連結地址查看。