標籤:style blog color os 使用 java ar strong 檔案
Unix/Linux上常見的Shell指令碼解譯器有bash、sh、csh、ksh等,Linux中最常用的是bash。
指令碼語言是一種解釋型語言,會執行這類程式時,解譯器(interpreter)需要讀取我們編寫的原始碼(source code),並將其轉換成目標代碼(object code),再由電腦運行。
而我們常見的C、C++、Java都是編譯型語言。這類語言需要預先將我們寫好的原始碼(source code)轉換成目標代碼(object code),這個過程被稱作“編譯”。
#!/bin/bashecho "Hello World !"
“#!” 是一個約定的標記,它告訴系統這個指令碼需要什麼解譯器來執行。
像perl指令碼通常會在第一句加上
#!/usr/bin/perl -w
對於加上這些標記的指令碼,可以通過修改許可權直接執行它們,比如這樣:
chmod +x ./test.sh./test.sh
chmod 是linux中修改許可權的一個命令,+x表示給後面那個檔案加上可執行檔屬性。
然後使用./test.sh就能運行指令碼了。
為什麼一定要用./test.sh才能運行指令碼,直接使用test.sh卻不行呢?
因為PATH這個環境變數預設後面是沒有加./的,如果直接執行test.sh自然是無法被找到的
[[email protected] addPort]# echo $PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
當然如果不加這個約定的標記,只需要這樣就能執行bash指令碼了
bash test.sh
使用 read 命令可以讀取終端stdin的資料
read inputStringecho "input String is $inputString"
會發現上面兩個inputString一個加了$一個沒有加,為什嗎?
我的理解是,當這變數被當做左值時,不需要加$,而當這個變來那個被當做右值時,必須加$
Shell聲明一個變數
testString1="hello"testString2=‘world‘testInt=123
初始化的時候必須注意的是,=號兩邊都不能有空格,不然是錯誤的,shell對格式的要求比較嚴格。
使用變數的時候就需要加上$符號了,因為這個時候它被當做一個右值來使用。
echo $testString1echo $testString2echo "${testInt}456"
當然,必要的時候需要加上花括弧,這樣才會跟後面的字串分隔開,用作解譯器限定邊界。
readonly :在變數前面加上readonly可以限定為唯讀變數
unset:使用unset可以刪除變數,刪除變數以後再輸出這個變數將不會有資料輸出。
shell當中存在二種變數類型,分別是局部變數和環境變數。
局部變數只能在shell當前指令碼中使用,而環境變數能被建立它們的shell指令碼以及派生出來的子進程中使用。
在Shell當中還有一些比較特殊的變數
變數 |
含義 |
$0 |
當前指令碼的檔案名稱 |
$n |
傳遞給指令碼或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。 |
$# |
傳遞給指令碼或函數的參數個數。 |
$* |
傳遞給指令碼或函數的所有參數。 |
[email protected] |
傳遞給指令碼或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同。 |
$? |
上個命令的退出狀態,或函數的傳回值。 |
$$ |
當前Shell進程ID。對於 Shell 指令碼,就是這些指令碼所在的進程ID。 |
$n和C語言main函數當中的char* argv[]比較相似,都是傳遞進來的參數,$#對應的就是int argc了,比如有兩個路徑,需要分別用ls命令查看目錄資訊,這個時候可以這樣:
#!/bin/bashmyPath1=$1myPath2=$2ls $1ls $2echo $#
然後執行這個指令碼
[[email protected] /]# chmod +x 123.sh [[email protected] /]# ./123.sh /mnt/ /usr/cdrom hgfsbin etc games include lib lib64 libexec local sbin share src tmp2
第一行列印的就是第一個參數ls以後的列表,第二行列印的就是第二個參數ls以後的列表,第三行列印的就是參數的個數。
$*和[email protected]被直接使用的時候,他們的參數都會被當成一個個體使用,而當兩者都被""包含時,"$*"會將參數組合成一個整體字串輸出,而"[email protected]"的參數任然是一個個體。
Shell指令碼學習(一)