Shell是一個命令行解釋器,它接受應用程序/用戶命令,然後調用操作系統內核。是一個功能強大的編程語言,易編寫、易調試、靈活性高。
Linux提供的Shell解析器有六種:cat /etc/shells
/bin/sh
/bin/bash
,在CentOS中默認解析器爲bash/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
腳本格式
-
腳本以
#!/bin/bash
開頭#!/bin/bash echo "hello world"
-
運行腳本文件可通過:
sh xx.sh
、bash xx.sh
、./xx.sh(注意需要.sh具備執行權限[x],chmod 777)
-
通過
touch xx.sh
創建腳本文件,通過vim xx.sh
編輯腳本文件。
系統變量
$HOME
,當前登錄用戶的home目錄$PWD
,當前所在目錄路徑$SHELL
,默認shell解析器$USER
,當前登錄用戶
自定義變量
- 基本語法
- 定義變量:變量=值
- 撤銷變量:
unset 變量名
- 聲明靜態變量:
readonly 變量名
,注意不能撤銷靜態變量,重啓即無效。 - 變量定義規則:字母、數字、下劃線組成,不能以數字開頭,建議環境變量大寫。
- 等號左右無空格,嚴格要求
- 變量默認爲字符串類型,無法直接進行數值運算。
- 變量的值若有空格,需要用引號括起來
- 將腳本中的局部變量,提升爲全局變量:
export 變量名
特殊變量
-
$n
-
功能描述:n爲數字。
$0
,代表該腳本名稱;$1-$9
,代表第一到第九個參數;第十以上的參數需要用${10}
表示。touch partmeter.sh
vim partmeter.sh
#!/bin/bash echo "$0 $1 $2"
bash partmeter.sh p1 p2
partmeter.sh p1 p2
-
-
$#
-
功能描述:獲取所有輸入參數個數,常用於循環
#!/bin/bash echo "$#"
bash partmeter.sh p1 p2
2
-
-
$*
-
功能描述:獲取命令行中所有的參數,將所有入參看做一個整體
#!/bin/bash echo "$*"
bash partmeter.sh p1 p2
p1 p2
-
-
$@
-
功能描述:獲取命令行中所有的參數,將所有入參區分對待
#!/bin/bash echo "$@"
bash partmeter.sh p1 p2
p1 p2
-
-
$?
- 功能描述:最後一次執行命令的返回狀態。若變量值爲0,證明上一次命令執行正確;若變量值爲非零,證明上一個命令執行出現錯誤。
運算符
- 基本語法
$((運算式))
或$[運算式]
expr
運算(運算符之間必須有空格)+
,加-
,減\*
,乘/
,除%
,取餘- 運算執行符號:`expr 2 + 3
條件判斷
- 基本語法
[ condition ]
,注意表達式前後需要有空格[ test ]
,條件非空即爲true;[],條件爲空即爲false;
- 常用判斷條件
=
字符串比較-lt
,小於-le
,小於等於-eq
,等於gt
,大於ge
,大於等於ne
,不等於-r
,有讀的權限-w
,有寫的權限-x
,有執行的權限-f
,文件存在且是一個常規文件file-e
,文件存在-d
,文件存在且是一個目錄directory
- 多條件判斷
&&
,前一條命令執行成功時,才執行後一條命令||
,前一條命令執行失敗時,才執行後一條命令
流程控制
if
-
基本語法:
if
後要有空格,條件表達式[]
前後必須有空格;elif
,代表else if;fi
結尾。#!/bin/bash if [ condition1 ];then content1 elif [ condition2 ] then content2 fi
case
-
基本語法:
case $變量名 in value)
格式,;;
case結尾,類似break;*)
代表default分支;esac
結尾;#!/bin/bash case $1 in 1) content1 ;; 2) content2 ;; 3) content3 ;; *) content4 ;; esac
for
-
基本語法1:
for((初始值;循環控制條件;變量變化))
格式;do
方法體;done
結尾;具體累加1-100的和:#!/bin/bash s=0 for((i=1;i<=100;i++)) do s=$[$s+$i] done echo $s
-
基本語法2:
for 變量 in value1 value2 value3
格式;$@
區分處理每個入參,$*
入參爲整體進行處理#!/bin.bash for i in "$*" do echo "ceshi * $*" done for j in "$@" do echo "ceshi @ $@" done
bash ceshi.sh zs ls
輸出結果爲:
ceshi * zs ls
ceshi @ zs
ceshi @ ls
while
-
基本語法:
while [ condition ]
格式;do
方法體;done
結尾;具體累加1-100的和:#!/bin/bash s=0 i=0 while [ $i -le 100] do s=$[$s+$i] i=$[$i+1] done
Read讀取控制檯輸入
-
基本語法:
read(選項)(參數)
- 選項
-p
,指定讀取值時的提示符-t
,指定讀取值時等待的時間(秒)
- 參數
- 變量:指定讀取值的變量名
- 選項
-
舉例:七秒內在控制檯上輸入name
#!/bin/bash read -t 7 -p "input your name in 7 seconds" name echo $name
函數
系統函數
basename [string/pathname][suffix]
,截取指定路徑下的文件名稱dirname 文件絕對路徑
,從給定包含絕對路徑的文件名中取出文件的所在路徑
自定義函數
-
基本語法
// 聲明函數 function funname[()]{ action; [return int;] } funname // 執行函數
Shell工具
cut命令
-
從文件的每一行剪切字節、字符和字段,並將這些字節、字符、字段輸出。
-
基本用法
-
cut [選項參數] filename
-
選項參數
-f
,列號,提取第幾列-d
,分隔符,按照指定分隔符分割列,默認分割符爲製表符\t
-
舉例:以空格爲分割符,切割文件內容第二列及以後內容輸出
cut -d " " -f 2- cut.txt
-
sed
-
流編輯器,一次處理一行內容。處理行內容時,把當前的行內容存儲在臨時緩存區中,稱爲"模式空間",接着用sed命令處理緩衝區中的內容,處理完成後將內容輸出。接着處理下一行,直到文末末尾。
-
基本用法
-
sed [選項參數] "命令功能" filename
-
選項參數
-e
,直接在指定列模式上進行sed的動作編輯
-
命令功能(常用)
a
,新增d
,刪除s
,查找並替換
-
舉例:
-
在文件第二行添加內容:add content
sed "2a add contend" filename
-
刪除文件中包含wo的行
sed "/wo/d" filename
-
用ni替換文件中的wo
sed "s/wo/ni/g" filename
,g
代表全局替換 -
刪除文件第二行並用ni替換文件中的wo
sed -e "2d" -e "s/wo/ni/g" filename
-
-
awk
-
文本分析工具,把文件逐行讀入,默認以空格爲分隔符將每行切片,切開的部分可在進行分析處理。
-
基本用法:
awk [選項參數] 'pattern1{action1} pattern2{action2} ...' filename
;pattern
匹配正則表達式;action
匹配內容符合時所執行的命令。-
選項參數
-F
,指定輸入文件分隔符-v
,複製一個用戶定義變量
-
內置變量
FILENAME
,文件名NR
,已讀記錄數NF
,瀏覽記錄的域的個數(切割後,列的個數)
-
舉例:搜索文件以root開頭的所有行,並輸出該行的第七列
awk -F : '/^root/{print $7}' filename
-
sort
-
文件排序,並按照排序結果標準輸出
-
基本用法
-
sort(選項)(參數)
-
選項
-
-n
,按照數值大小排序 -
-r
,以相反的順序排序 -
-t
,設置排序的所用分割字符 -
-k
,指定需要排序的列 -
參數
- 指定待排序的文件列表
-
舉例:文件按照冒號分割,第三列倒序排序
sort -t : -nrk 3 filename
-
-