標籤:
1. 什麼是Bash?
Bash是一個為GNU計劃編寫的Unix Shell, 也是許多Linux平台預設使用的Shell。
Shell是一個命令直譯器,是介於作業系統核心和使用者之間的一個絕緣層。同時, Shell也是一種解釋性語言或指令碼語言。它通過將系統調用、公用程式、工具和編譯過的二進位程式"粘合"在一起來建立應用, 也稱"膠水語言"。
2. 為什麼學Bash?
對於任何想適當精通一些系統管理的人來說, 掌握Shell指令碼的編寫都是最基本的。
3. Bash指令碼的運行方式:
# 使用shell來執行$ sh script.sh# 使用bash來執行$ bash script.sh# 賦予指令碼的所有者該執行許可權,允許該使用者執行該指令碼$ chmod u+rx script.sh# 執行命令,這將使用指令碼第一行指定的shell來執行,如果指定shell不存在,將使用系統預設shell來執行$ ./script.sh
4. 清空/var/log下的log檔案:
#!/bin/bash# 初始化一個變數LOG_DIR=/var/logcd $LOG_DIRcat /dev/null > messagescat /dev/null > wtmpecho "Logs cleaned up."exit
5. Bash中的特殊字元
1). # 注釋
行首以"#"開頭(除"#!"之外)的是注釋。"#!", 用於指定當前指令碼的解譯器(使用絕對路徑)
#!/bin/bash echo "The # here dose not begin a comment." echo ‘The # here dose not begin a comment.‘ echo The \# here dose not begin a comment. echo The # 這裡開始一個注釋 echo ${PATH#*:} # 參數替換,不是一個注釋 echo $(( 2#101011 )) # 數制轉換(使用二進位表示),不是一個注釋
2). ; 命令分隔字元
使用";"可以在同一行上寫多個命令
echo hello; echo world
3). ;; case語句選項終止標記
使用";;"可以終止case選項
#!/bin/bash varname=b case "$varname" in [a-z]) echo "alphabet"
;; [0-9]) echo "number"
;; esac
4). . 點號 等價於source命令
. script.shsource script.sh
5). " 雙引號
將逸出字元視為一般字元, 允許Shell變數、Shell命令替換
6). ‘ 單引號
將逸出字元都是為一般字元, 不允許Shell變數、Shell命令提換
7). / 斜線
檔案名稱路徑分隔字元, 除法運算子
8). \ 反斜線
取消逸出字元的特殊含義
9). ` 反冒號
命令替換
10). : 冒號
i. 空命令, 與Shell內建的命令true作用相同
#!/bin/bash while : # while true do echo "endless loop" done
#!/bin/bash condition=5 if condition>0 then : # 什麼都不做,退出分支 else echo "$condition" fi
ii. 變數擴充/字串替換
$ : > file # 檔案“file”現在被清空了 # 與 cat /dev/null > file 的作用相同 # 然而,這並不會產生一個新的進程, 因為“:”是一個內建命令
11). ? 測試操作符
等價於C語言中的三元操作符
#!/bin/basha=10(( t=a<2?8:9 ))echo $techo $((a<2?8:9))
12). $ 變數替換
13). $( ) 命令替換
14). () 小括弧
i. 命令組
在括弧中的命令列表, 將會作為一個子Shell來執行(子Shell中的變數在父Shell中不可見):
#!/bin/basha = 123( a=321; )echo $a # 123
ii. 初始化數組
#!/bin/basharray=(1 2 3 4 5)echo ${array}
15). {} 大括弧
i. 檔案名稱擴充
mv file{,.bak}
注意: 大括弧中, 不允許有空白, 除非這個空白被引用或轉義!
ii. 代碼塊
等同於與一個匿名函數, 但其內聲明的變數, 在之後的代碼仍可見
#!/bin/basha=123{ a=321; }echo $a # 321
16). [] 中括弧
i. 條件測試
[ 是Shell內建test命令的一部分, 不是/usr/bin/test中的外部命令的一個連結
#!/bin/basha=5if [ $a -lt 10 ] ; then echo $aelse echo 10fi
注意: [[ ]] 雙中括弧也可用於條件測試:
[[ 2 -lt 1 ]] || echo "false"[[ 1 -lt 2 ]] && echo "true"
ii. 數組元素
#!/bin/basharray=(1 2 3 4 5)array[3]=10echo ${array[3]}
17). <, > 角括弧
i. 重新導向
> 標準輸出重新導向, &> 標準輸出、標準錯誤輸出重新導向, >&2標準輸出重新導向到標準錯誤輸出, >> 追加
18). | 豎線 管道
cat file | tr ‘a-z‘ ‘A-Z‘
19). - 破折號
i. 選項, 首碼
-eq, -le, -ge, ...
ii. 用於重新導向stdin, stdout
#!/bin/bashBACKUPFILE=backup-$(date +%m-%d-%Y)# 在備份檔案中嵌入時間.archive=${1:-$BACKUPFILE}# 如果在命令列中沒有指定備份檔案的檔案名稱,#+ 那麼將預設使用"backup-MM-DD-YYYY.tar.gz".tar cvf - `find . -mtime -1 -type f -print` > $archive.targzip $archive.tarecho "Directory $PWD backed up in archive file \"$archive.tar.gz\"."exit 0
20). ~ 波浪號
i. 使用者主目錄
6. 變數替換
echo $HOMEecho "$HOME"echo ‘$HOME‘
注: 如果沒有引號, 將自動刪除輸出中多餘的空白符!
7. 變數賦值 =
注意: 賦值操作前後不能有空白!
8. 特殊變數
i. 局部變數: 只在代碼塊或函數中可見
ii. 環境變數: Shell中定義的變數
iii. 位置參數: $0, $1, ... $9, ${10}, ${11},...
$*, [email protected]
Shell介紹與入門