課程視頻:【【尚硅谷】Shell腳本從入門到實戰】
一、Shell概述
為什么要學習Shell?
1)需要看懂運維人員的Shell程序
2)偶爾編寫一些簡單的Shell程序來管理集群、提高開發效率
什么是Shell?
1)Shell是一個命令行解釋器,它接受應用程序/用戶命令,然后調用操作系統內核。
2)Shell還是一個功能相當強大的編程語言,易編寫、易調試、靈活性強。
二、Shell解析器
Linux提供的Shell解析器有:/bin/sh、/bin/bash等。
sh實際是軟連接直接指向bash
三、Shell腳本入門
1、腳本格式
以#!/bin/bash開頭(指定解析器)
2、創建一個helloworld腳本
創建腳本文件:touch helloworld.sh
#!/bin/bashecho "helloworld"
運行腳本:sh helloworld.sh或bash helloworld.sh或./helloworld.sh(用戶執行,需要有權限)
3、創建一個多命令處理腳本
要求在/home/目錄下創建一個banzhang.txt,在該txt文件中增加“I love cls”.
創建腳本文件:touch batch.sh
#!/bin/bashcd /home/
touch banzhang.txt
echo "I love cls" >> banzhang.txt
運行腳本:bash batch.sh
四、Shell中的變量
系統變量
$HOME、#PWD、$SHELL、$USER等
查看變量值:echo+變量名。如:echo $HOME。
自定義變量
1)定義變量:變量=值。如:NUM=1。
2)撤銷變量:unset 變量。如:unset NUM。
3)聲明靜態變量:readonly 變量(不能被撤銷unset)。如:readonly NUMBER=2。
自定義變量定義規則
1)變量名可以由字母、數字和下劃線組成,但是不能以數字開頭,環境變量名建議大寫。
2)等號兩側不能有空格。
3)在bash中,變量默認都是字符串類型,無法直接進行數值運算。
4)變量值如果有空格,需要使用單引號或雙引號括起來。
5)把變量提升為全局環境變量,可供其他Shell程序使用:export 變量名。如:export NUMBER。
特殊變量$n、$#、$*、$@、$?
$n:其中n為數字,$0表示該腳本的名字,$1-$9表示傳入腳本的1-9個參數。
#!/bin/bash
#創建一個名為parameter.sh的腳本
echo "$0 $1 $2"
運行bash parameter.sh ABC 123,會輸出parameter.sh ABC 123。
$#:獲取所有輸入參數個數。
#!/bin/bash
#創建一個名為parameter.sh的腳本
echo "$0 $1 $2"
echo $#
運行bash parameter.sh ABC 123 abc,會輸出
parameter.sh ABC 123
3。
$*:代表命令行中的所有參數,$*把所有的參數看成一個整體。
$@:代表命令行中的所有參數,$@把每個參數區分對待。
#!/bin/bash
#創建一個名為parameter.sh的腳本
echo "$0 $1 $2"
echo $#
echo $*
echo $@
運行bash parameter.sh ABC 123 abc,會輸出
parameter.sh ABC 123
3
ABC 123 abc
ABC 123 abc。
$?:最后一次執行命令的返回狀態。0表示正確執行,非零表示沒有正確執行。
五、運算符
基本語法
1)$((運算式))或$[運算式]
2)expr + - \* /% (expr運算符之間必須有空格)
實操
計算2+3:expr 2 + 3
計算(2+3)*4,expr `expr 2 + 3` \* 4 或 $[(2+3)*4]
六、條件判斷
基本語法
[ condition ](condition前后要有空格,條件非空即為true)
常用判斷條件
= | 字符串比較 | ||
---|---|---|---|
-lt | 小于 | -le | 小于等于 |
-eq | 等于 | -gt | 大于 |
-ge | 大于等于 | -ne | 不等于 |
按照文件權限進行判斷: | |||
-r | 有讀的權限 | ||
-w | 有寫的權限 | ||
-x | 有執行的權限 | ||
按照文件權限進行判斷: | |||
-f | 文件存在且是一個常規文件 | ||
-e | 文件存在 | ||
-d | 文件存在且是一個目錄 |
如:
判斷23是否小于22:[ 23 -le 22 ]
判斷helloworld.sh是否具有寫權限:[ -w helloworld.sh]
多條件判斷
&&表示前一條命令執行成功后,才執行后一條命令;
||? ?表示上一條命令執行失敗后,才執行下一條命令。