Shell指令碼學習(一)

來源:互聯網
上載者:User

標籤: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指令碼學習(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.