實驗樓-高級Bash腳本編程指南
實驗1.Bash介紹與入門
1.簡介:Bash是一個為GNU計劃編寫的Unix shell,它是許多Linux平臺默認使用的shell
shell是一個命令解釋器,是介於操作系統內核與用戶之間的一個絕緣層。所有的UNIX命令和工具再加上公共程序,對於Shell腳本來說,都是可調用的。
2.運行Bash腳本的方式: 1)使用shell來執行:sh hello.sh
2)使用Bash來執行:bash hello.sh
3)還可以讓腳本本身就具有可執行權限,通過chmod命令可以修改:chmod u+rx hello.sh 然後運行 ./hello.sh
3.使用重定向:>為重定向符號,例如將輸出文件保存在一個txt中, eg: echo "hello world">my.txt
4.使用腳本清除/var/log下的log文件:
/dev/null 可以理解為一個黑洞,裏面是空的,什麽東西都可以往裏面扔,扔了就沒了。
實驗2.Bash中的特殊字符(上)
1.註釋:#為註釋
#!用於指定當前腳本的解釋器,這裏用bash,應該知名其完整路徑,即#!/bin/bash
在echo中轉義的#是不能作為註釋的,eg:echo The \# here doesn‘t begin a comment
2.分號:1)使用分號可以在同一行上寫兩個或兩個以上的命令
2)使用雙分號可以終止case選項
3.點號:等價於source命令,用於在當前Bash環境下讀取並執行filename.sh中的命令
4.引號:1)“ ”:雙引號會組織string中大部分特殊字符
2)‘ ’:單引號會組織string中所有特殊字符的解釋,這是一種比雙引號更強烈的形式
5.斜線和反斜線:1)斜線 /:文件名路徑分隔符,分割文件名不同的部分;也可以用作除法算術操作符。註意在Linux中表示路徑的時候,許多個/和一個/是一樣的效果
2)反斜線:一種對單字符的引用機制,轉義表示
6.反引號:命令替換,command結構可以將命令的輸出賦值到一個變量中去。反引號中的命令會優先執行
eg: cp `mkdir back` hello.sh back
7.冒號:1)空命令:等價於“NOP”,也可以被認為與shell的內建命令true作用相同,退出碼是(0),即while:與while true語義相同
2)變量擴展/子串替換
與>重定向操作符結合使用時,將會把一個文件清空,但不會修改這個文件的權限,如果之前這個文件不存在,就創建這個文件
與>>重定向操作符結合使用時,將不會對預先存在的目標文件產生任何影響,如果這個文件不存在,就創建這個文件
3)註釋行(不推薦)
4)用來在/etc/passwd和$PATH變量中做分隔符
8.冒號
1)測試操作符:在一個雙括號結構中,?就是c語言的三元操作符
9.美元符號($)
1)變量替換
2)命令替換
實驗3-bash中的特殊字符(下)
1.小括號()
1)命令組:在括號中的命令列表,會作為一個子shell來運行。由於是在子shell中,所以腳本剩下的部分是不可用的。父腳本,即腳本本身,將不能夠讀取在子進程中創建的變量。
2)初始化數組:arr=(1 2 4 5)
echo ${arr[2]}
2.大括號{}
1)文件名擴展,eg cp t.{txt,back}---沒太懂
2)代碼塊,又被稱為內部組,這個結構事實上創建了一個匿名函數。然而,與標準函數不同的是,其聲明的變量,對於腳本其他部分的代碼來說還是可見的
3.中括號[]
1)條件測試:條件測試放在[]中,其中[shell內建test命令的一部分,不是/usr/bin/test中的外部命令的一個鏈接,雙中括號[[ ]]也用作條件測試
2)數組元素:數組中每個元素的標號
4.尖括號(< 和 >)
1)重定向:test.sh>filename 重定向test.sh的輸出到文件filename中,如果filename存在,那麽將會被覆蓋
test.sh&>filename 重定向test.sh的stdout(標準輸出)和stderr(標準錯誤)到filename中
test.sh>&2重定向test.sh的stdout到stderr中
test.sh>>filename把test.sh的輸出追加到文件filename中,如果filename不存在將會被創建
5.豎線(|)
1)管道:分析前邊命令的輸出,並將輸出作為後邊命令的輸入,這是一種產生命令鏈的好方法。eg: ls -l | ./test.sh #把ls -1的輸出輸送到一個腳本中
6.破折號(-)
1)選項,前綴:在所有的命令內如果想使用選項參數的話都要加上前綴
2)用於重定向stdin或stdout
7.波浪號(~):表示home目錄
實驗4-變量和參數
1.變量賦值:賦值時等號前後一定不要有空格;等號既可以做條件測試操作,也可以用於賦值操作
變量引用:引用一個變量將保留其中的空白,如果是變量替換就不會有了,所以在shell中如果想打印空白字符,需要用雙引號進行引用"$hello"
多變量設置:同一行要設置多個變量,應該用空格隔開
2.變量不區分類型:與大多數編譯型語言不同,Bash不區分變量的類型。本質上,Bash變量都是字符串,但是依賴於具體的上下文,Bash也允許比較操作和整數操作,其中的關鍵因素是,為變量賦的值是否只有數字。
case "$varname" in [a-z]) echo "abc";; [0-9]) echo "123";; esac
實驗樓-高級Bash腳本編程指南