1.Shell中的特殊字符
# | 註釋 |
; | 命令分割符,可以將多個語句放在一行執行 |
‘ ’(單引號) | 強引用,在單引號中無法引用變量 |
" "(雙引號) | 類似於’ ’,但支持變量替換 |
` `(反引號.爲tab鍵上方按鍵) | 用於引用命令的執行結果 |
2.變量
命名規則:以字母開頭,可以使用數字字母
變量定義:declare varName
變量賦值:varName=值
變量值引用: $varName
導出變量: export varName[=value]
撤銷變量: unset varName
特殊變量:
$?:返回上一條命令的狀態返回值
$1,$2...:位置變量
$#:腳本傳入的所有參數個數
$*,$@:返回腳本傳入的所有參數
3.條件測試
使用格式:
test EXPR
[ EXPR ]
[[ EXPR ]]
文件測試 | 字符測試 | 整數測試 | |
-a|-e FILE:是否存在 | -S FILE:套接字文件 | > :大於 | -gt:大於 |
-f FILE:普通文件 | -p FILE:命名管道文件 | <:小於 | -ge:大於等於 |
-d FILE:目錄 | -s FILE:是否爲空文件 | <=:小於等於 | -eq:等於 |
-L FILE:符號鏈接文件 | -r FILE:是否可讀 | >=:大於等於 | -le:小於等於 |
-b FILE:塊設備文件 | -w FILE:是否各寫 | ==:等於 | -lt:小於 |
-c FILE:字符設備文件 | -x FILE:是否可執行 | !=:不等於 | -ne:不等於 |
FILE1 -nt FILE2 :FILE1的mtime是否新與FILE2 | -n String :是否不空 | ||
FILE1 -ot FILE2 :FILE1的mtime是否舊與FILE2 | -z String:是否爲空 |
4.輸入輸出和重定向
標準輸入:0 默認設備爲鍵盤
標準輸出:1 默認設備爲顯示器
標準錯誤輸出:2 默認設備爲顯示器
>::覆蓋輸出 &>錯誤覆蓋輸出
>> :追加輸出 &>>錯誤覆蓋輸出
&>:合併重定向
<:輸入重定向
<<:此處文檔
tee:分流,將結果輸出到屏幕並重定向
5.Shell腳本格式
第一行頂格"#!/path/to/a/shell"
6.常用語法結構
條件判斷 | |
語法格式 | 示例 |
單分支if語句 if 語句1;then 語句1執行結果爲真則執行 else 語句1執行結果爲假則執行 fi
| #!/bin/bash a=1 b=1 if [ $a -eq $b ];then echo "yes" else echo "no" fi |
多分支if語句 if 語句1;then 語句1執行結果爲真則執行 elif 語句2;then 語句2執行結果爲真則執行 ... else 所有條件都不滿足時執行 fi
| #!/bin/bash a=1 b=2 if [ $a -gt $b ];then echo "a>b" elif [ $a -lt $b ];then echo "a<b" else echo "a=b" fi |
循環結構 | |
for varName in LIST;do 循環體 done | #!/bin/bash for i in {1..10};do echo $i done |
for ((var=#;測試條件;修正條件));do 循環體 done | #!/bin/bash for ((i=1;i<=10;i++));do echo $i done |
while 條件語句;do #條件爲真時進入循環 循環體 done | #!/bin/bash while ! who|grep “^gentoo”;do echo “gentoo is not login” sleep 3 done |
until 條件語句;do 循環體 done | #!/bin/bash while who|grep “^gentoo”;do echo “gentoo is not login” sleep 3 done |
條件選擇 | |
case $varName in exp1) 語句體1 ;; exp2) 語句體 2 ;; ... *) 語句體 n ;; | #!/bin/bash tmp=y case $tmp in y|yes) echo yes ;; n|no) echo no ;; *) echo “unknown” esac |
7.函數使用和循環條件控制
函數聲明方式
function 函數名{ 函數體 } 函數名() { 函數體 }
函數使用方式
函數名 [參數....]
參數可以在函數體中用位置變量引用
循環條件控制
continue:提前進入下一輪循環
break #: #默認爲1,跳出#層循環