目錄
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 賦值表達式的功能等同於「((賦值表達式))」 範例:給變量 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 等條件語句相結合,來完成測試判斷,以減少程序運行錯誤。
文件f1比文件f2新則為真
10f1 -ot f2 ,ot的全拼為older than文件f1比文件f2舊則為真
註:(())不能用於文件測試,文件測試一般常用的是 []
註:== 和 != 兩端要有空格 ,(())不能用於字符測試
"="和"!="也可以在[]中作比較使用,但在[]中使用包含"<"和">"的符號時,需要用反斜線轉義,有時不轉義雖然語法不會報錯,但是結果可能不對。
也可以在[[]]中使用包含「-gt」和「-lt」的符號,但是不建議使用
比較符號兩端也要有空格,[] (()) [[]] 兩端都要有空格
#####單條件判斷##############
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在條件語句及循環語句(for、while、if等)中用於控制程序走向;而exit則用於終止所有語句並退出當前腳本。
#! /bin/bash
cd /opt/project/
scrapy crawl xx
python3 test.py
相關文章:
Linux中sed工具的使用
Linux中grep工具的使用
Linux中awk工具的使用
Linux中正則表達式和字符串的查詢、替換(tr/diff/wc/find)