一:關於腳本
- 1:linux下的腳本簡單的概括起來就是將多個命令,變量 嵌套與不同的控制語句及函數中而組合起來的一個順序執行命令的批處理任務
- 2:在linux中一個腳本的展開需以#!/bin/bash開始
- 下面可以附加一些關於腳本的相關的注釋信息:比如:作者,腳本的要實現的功能,版本,時間等
3:最後一個腳本的執行時該腳本必須要有執行權限或者使用bash scripts_name 的形式執行- 4:腳本不需要編譯執行,而是解釋執行(執行效率比較低)。
二:基礎
linux腳本中的變量不需要事先聲明,而是直接定義使用(這點不同於其他高 級編程語言中變量的使用)
變量的分類:變量的賦值:
- 本地變量(局部變量):在一段代碼串(一個函數或者控制語句等)中定義的變量
- 該變量在當前shell生效
- 環境變量 :當前使用的shell中定義的變量(export 定義的變量或者env,set中定義的變
- 改變量在當前設shell及其子shell中生效
- 特殊變量:常見的$?(一個命令的執行狀態的返回值) 0 為正確結果,其他數值的為錯誤結果
位置變量:$1 $2 $3....${10},${11}...${n}
例如:
- 變量的賦值:var_name=var_value
- 顯示變量的值使用echo var_name
650) this.width=650;" border=0> 變量的引用:
- var_name=`COMMAND` 的形式引用
- 通過上面的例子我們可以發現
- 變量的引用時通過$符號加上變量名的形式引用變量的
- $var_name
關於命令的替換,必須明白三種符號 ""(雙引號) ''(單引號) ``()的意義 看 下面的例子,我們由此展開
650) this.width=650;" border=0>
- "": 可以實現命令替換
- '': 變量強引用
- ``: 對命令的結果引用(命令替換) 上面的例子還可以使用echo $(cat a.txt)
命令的邏輯關系
例1: 650) this.width=650;" border=0> 例2: 650) this.width=650;" border=0>
- 命令的邏輯關於有三種
- 與關系
- command1&&command2
- command1 和command2 同時為真是結果才為真
- command1 和command 其中一個為假結果則為假
- 備注:當command1為真時command2才執行,command1為假時command不執行(結果已經明確了)
- 或關系
- command1||commadn2
- command1 和command2 同時為假是結果才為假
- command1 和command 其中一個為真結果則為真
- 備注:當command1為假時command2才執行,command1為真時command不執行(結果已明確了)
- 非關系
- !command
- 比命令的執行結果取反
例3:
650) this.width=650;" border=0>
一般格式 [ express ] 或者test express
[[ express ]] (代表關鍵字)
整數測試:
關於整數測試的符號有:
-gt(大於) -ge(大於等於)
-lt(小於) -le(小於等於)
-eq(等於) -ne(不等於)
- 整數的測試須放在[]中就行
例如:
650) this.width=650;" border=0>
- 注意[]內的兩頭必須有空格。
算術運算:
let [ express ]
expr express
例如:
650) this.width=650;" border=0> 注意兩邊的空格
650) this.width=650;" border=0>
字符串測試:
- (字符串的比較實際上其對應的ASCII的比較,另字符串的測試一般放在[[ ]]中進行
運算符:>(大於) >=(大於等於)
<(小於) <=(小於等於)
!=(不等於) =(等於
- -z "string":測試string字符串是否為空
- -n "string":測試string字符串是否不為空
例如
650) this.width=650;" border=0>
650) this.width=650;" border=0>
文件測試:
- -e:測試給出的條件是否存在
- -f:測試給出的條件是否是個文件
- -d:測試給出的條件是否是個目錄
- -r:測試給出的文件是否具有讀的權限(相應的有-w:寫 -x:可執行)
例如:
650) this.width=650;" border=0>
三 :腳本編程中的控制語句
在腳本中if語句有三種:單分支,雙分支,多分支
單分支 雙分支 多分支單分支:
- if 條件;then if 條件;then if 條件1;then
- statement1 statement1 statement1
- statement2 else elif 條件2;then
- fi statement2 statement2
- fi elif 條件3;then
- ......
- fi
雙分支:650) this.width=650;" border=0>
- # 如果 /etc/passwd 存在
- if [ -e /etc/passwd ];then
- #打印 exist
- echo "exist"
- fi
多分支:650) this.width=650;" border=0>
- #如果 /etc/passwwd 存在
- if [ -e /etc/passwwwd ];then
- #打印 exit
- echo "exist"
- else
- #打印 no exist
- echo "not exist"
- fi
- if [ -d /etc/passwd ];then
- echo "directory"
- elif[ -f /etc/passwd ];then
- echo"file"
- else
- echo "nothing"
- fi 在腳本編程中可以使用#注釋一行代碼。另if語句還可以嵌套使用
腳本中case 語句的格式
case語句中當var在var_value中獲得到正確的結果是就退出case語句,下面statement不再執行
- case var in var:變量 var_value:變量取值
- var_value1)
- statement1
- ;; var_value2)
- statement2
- ;;
- *) ------其他任意值
- statement
- ;;
- esac
循環控制語句:
for循環的列表表示方法: 1:可以是 {起始值..結束值} 2:可以使用`seq 起始值 結束值` 3:還可以是命令(命令的執行可以得到一個列表) 例如:計算1到5之間的整數的和
- for 變量 in 列表;do
- statement()循環體
- done
注意:for循環的條件是變量在列表中可以取到值,否則將不執行 循環體語句,同樣for循環也可以嵌套使用
- #!/bin/bash
- declare -i sum=0
- for i in {1..5};do
- sum=$[$sum + $i]
- done
- echo $sum
同樣可以寫成這樣子
- for i in `seq 1 5`;do
- sum=$[$sum + $i]
- done
- echo $sum
- for i in `ls /root`;do
- if [ -f $i ];then
- echo "$i is file"
- elif [ -d $i ];then
- echo "$i is directory"
- else
- echo "$i cann't identification"
- fi
- done
- while 條件;do
- statemnt(循環體)
- done
注意 1:while循環是在條件滿足時進入循環,當條件不滿足時退出循環體
2:循環體中須有讓循環體自動的去判斷條件語句的條件,否則循環將陷入死循環或者達不到我們預期的目的 3:條件可以是個命令或者條件表達式
例如:
- declare -i sum=0
- declare -i i=1
- while [ $i -le 5 ];do
- sum=$[$sum + $i]
- let i++
- done
- echo $sum
另外wile語句的強大的例子
while read line;do
statement
done < 文件
例如:
- while read line;do
- cut -d: -f1
- done < /etc/passwd
格式
- until 條件;do
- statement
- done
- until循環的條件是當條件不滿足是就循環,滿足是就退出
- read -p "please input your choice:" CHOICE
- until [ "$CHOICE" = 'q' -o "$CHOICE" = 'Q' ];do
- echo "this is example"
- read -p "please input your choice:" CHOICE
- done
break 和continue常常和其他循環語句一起嵌套使用
說明:break 是直接退出循環體,而continue是退出本次循環直接進入下一次的循環。
在腳本中函數的功能為獨立的實現一個功能模塊。格式為
- function FUN_name {
- 函數體
- }
- 或者
- FUN_name {
- 函數體
- }