1.1 簡介
1 打開終端後,就會出現一個提示符,形式通常如下
username@hostname$ 或者root@hostname#
2 $表示的是普通用戶,#表示的是超級用戶。超級用戶是Linux中權限最高的用戶
3 有兩種運行腳本的方式
sh script.sh 或者是 path script (path是腳本所在的目錄)
4 在bash中每個命令是通過分號";"來分開的
1.2 終端打印
1 echo是用於終端打印的基本命令,在默認情況下echo在每次調用後都會添加一個換行符
2 另一個可以用來終端打印的命令是printf,printf的參數和C語言中的printf函數一樣
3 在默認情況下,echo會將一個換行符追加到輸出文本的尾部,可以使用-n來忽略結尾的換行符
4 如果需要使用轉義序列,則采用echo -e ”包含轉義序列的字符串"這種形式
1.3 玩轉變量和環境變量
1 我們可以使用pgrep來快速找到一個進程的pid,假如有一個gedti正在運行,那麼我們通過pgrep gedit就可以快速知道這個gedit的進程id
2 一個變量可以通過以下方式來進行賦值 var=value,var是變量名,value是變量值,如果value不包含任何空白字符,那麼他不需要使用引號來進行引用,否則就需要使用引號進行引用
3 環境是未在當前進程中定義,而從父進程中繼承來的變量
4 export命令用來設置環境變量
5 獲得字符串的長度 length=${#var},可以用來求變量var的長度
1.4 通過shell進行數學運算
1 在bash環境中,我們可以使用let (()) 和[]來進行基本的算數操作,在進行高級的運算中,可以使用expr和bc
2 當使用let的時候,變量名之前是不需要再添加$,例如let res=num1+num2
3 let支持++和--等各種操作
4 操作符[]的使用方法和let命令類似,例如res=$[ num1 + num2 ]
5 也可以使用(()),但是使用(())時,變量名之前要加上$,例如res=$(( num1 + num2 ))
6 我們可以使用scale=2來將小數點位數設置為2
1.5 玩轉文件描述符和重定向
1 文件描述符是於文件輸入,輸出相關聯的整數,他們用來跟蹤與打開的文件,最常見的文件描述符是stdin,stdout,stderr。
2 文件描述符是與一個打開的文件或數據流相關聯的整數,文件描述符0,1和2是系統預留的
0 - stdin標准輸入,1 - stdout標准輸出,2 - stderr標准錯誤
3 用下面的方法可以把輸出文本重定向到一個文件中
echo "this ...." > out , 這樣便可以把輸出的字符串重定向到out文件中
4 >和>>並不相同,前者是會先清空文件再寫入內容,而後者是會將內容追加到現有的文件的尾部
5 當使用重定向操作符的時候,重定向的內容不會出現在終端,而是直接被導入文件。重定向操作默認使用標准輸出
6 >等同於1>;對於>>來說,等同於1>>
7 借助重定向,我們可以使用stdin那樣從文件中讀取數據 cmd < file
8 我們可以使用exec命令創建自定義的文件描述符
1.6 數組和關聯數組
1 bash同時支持數組和關聯數組,普通數組只能使用整數做為數組索引,而關聯數組可以使用字符串做為數組索引
2 定義數組的方法有很多種
第一種:array_var=(1 2 3 4 5),這些值會存儲在以0為起始索引的連續位置上
第二種:array_var[0]=1
array_var[1]=2
......................
3 打印特定元素的數組內容,${array_var[index]},將會打印處索引為index的內容
4 以清單形式打印處數組中的所有值,${array_var[*]}
5 打印數組的長度${#array_var[*]}
6 在關聯數組中,我們可以使用任意的文本做為數組索引,在普通數組中,只能用整數做為索引
7 首先我們需要單獨的聲明語句將一個變量名聲明為關聯數組declare -A ass_array
1.7 使用別名
1 別名有多種實現方式,可以使用函數,也可以使用alias命令
2 可以按照以下方式來創建一個別名 alias new_command='command'
3 alias命令的作用只是暫時的,我們要寫在~/.bashrc中,然後用source ~/.bashrc這樣就可以長久的使用別名
4 如果要刪除別名,我們可以使用unalias或者直接刪除~/.bashrc
1.8 獲取終端信息
1 獲取終端的行數和列數 tput cols 和 tput lines
2 打印當前的終端名 tput longname
3 刪除當前光標位置到行尾的所有內容 tput ed
1.9 獲取/設置日期和延時
1 我們使用date來打印處日期
2 打印紀遠時 date +%s,紀遠時被定義為從世界標准時間1970年1月1號0時0分0秒至當前時刻的總秒數
3 用格式串結合+作為date命令的參數,可以按照你的選擇打印出對應的格式和日期
4 我們可以使用sleep time來延時time秒
5 tput sc是用來存儲光標位置,tput rc是恢復光標位置,tput ed是清除從當前光標位置到行末的內容
1.10
1 使用-x,啟動跟蹤調試shell腳本,運行帶有-x標志的腳本能夠打出所執行的每一行命令及當前狀態
2 針對每一種情況,我們可以在腳本中設置啟用或是禁止調試打印
set -x 在執行時顯示參數和命令
set +x 禁止調試
set -v 當命令進行讀取時顯示輸入
set +v 禁止打印輸入
3 我們可以直接使用shebang #!/bin/bash改成#!/bin/bash -xv不用其它顯項直接進行調試
1.11
1 函數定義
function fname(){
statements
}
或者是
fname(){
statements
}
2 只要使用函數名就可以調用某個函數 fname,就會執行fname函數
3 參數可以傳遞給函數 fname arg1 arg2
4 類似地,參數可以傳遞給腳本並通過script來訪問
$1 是第一個參數
$2 是第二個參數
$n 是第n個參數
$@ 被擴展成"$1" “$2" "$3"
$* 被擴展成"$1c$2c$3",其中c是IFS的第一個字符
$@ 用的比較多,由於$*把所有的參數都當作單個字符串,因此很少被利用
5 在bash中每一條命令執行之後都會返回一個值,如果是0表示執行成功,其它表示執行失敗
1.12
1 我們使用管道pipe來連接每一個過濾器,例如$cmd1 | cmd2 | cmd3,這裡組合了三個命令,cmd1輸出傳遞給cmd2,而cmd2傳遞給cmd3,最終輸出將會被打印或導入某個文件
2 我們有兩種方法取得命令序列的輸出
第一種:output=$(cmd),這樣就會把cmd命令的結果輸出到output上
第二種:output=`cmd`,這樣就會把cmd命令的結果輸出到output上
3 假設我們使用子shll或反引用的方法將命令的輸出讀入一個變量中,可以將它放入雙引號中,以保留空格和換行符
1.13 字段分割符和迭代器
1 內部字段分割符IFS是shell腳本中一個重要的概念,默認的IFS是空白字符(換行符,制表符或者空格)
2 我們可以輕松的生成不同序列
echo {1..50} 這樣能夠生成一個從1到50的序列
echo {a..z} 這樣能夠生成a到z的序列
3 for循環
for i in list
do
statements
done
4 while循環
while condition
do
statements
done
1.14 比較和測試
1 if條件
if condition
then
statements
elif condition
statements
else
statements
fi
2 我們可以使用邏輯運算符來減少if else的使用
[ condition ] && action 如果condition條件為真,那麼執行action
[ condition ] || action 如果condition條件為假,那麼執行action
3 算術比較
-eq: 相等
-ne: 不相等
-gt: 大於
-lt: 小於
-ge: 大於等於
-le: 小於或等於
4 文件系統相關測試
[ -f $file ] 如果給定的文件是普通文件則返回真
[ -x $file ] 如果給點的文件具有執行權限則返回真
[ -d $file ] 如果給點的文件是目錄則返回真
[ -e $file ] 如果文件file存在則返回真
[ -c $file ] 如果給定的文件是字符設備文件則返回真
[ -b $file ] 如果給點的文件是塊設備文件則返回真
[ -w $file ] 如果給點的文件具有可些權限則返回真
[ -r $file ] 如果文件file具有可讀權限則返回真
[ -L $file ] 如果給點的文件file是一個符號鏈接文件則返回真
5 字符串比較
1 使用字符串比較的時候,最好使用雙中括號,因為有時候采用單個中括號會產生錯誤
2 [[ $str1 = $str2 ]],當str1等於str2的時候,返回真
[[ $str1 != $str2 ]],當str1不等於str2的時候,返回真[[ $str1 > $str2 ]],當str1大於str2的時候,返回真
[[ $str1 < $str2 ]],當str1小於str2的時候,返回真
[[ -z $str ]]如果str是空字符串返回真
[[ -n $str ]]如果str是非空字符串則返回真
6 test命令同樣可以用來執行條件檢測,有助於避免過多的括號