標籤:運行環境 linux 關鍵字 程式 單詞
bash shell 指令碼簡介shell 運行環境
如果你啟動並執行是 Unix 或 Linux 系統,例如 Ubuntu,Red Hat,SUSE Linux,還有macOS,都是內建了 bash shell 的,所以你不需要額外配置所謂的開發環境。
我的 shell 環境是 macOS Sierra 版本,如果你用的是其他 Linux 系統,後面的例子基本上都是可以啟動並執行。
首先,開啟Terminal 命令列,先檢查下你的系統的 shell 版本:
echo $BASH_VERSION
bash 命令階層命令類型
bash shell 內建了一個type
命令會根據你輸入的單詞來顯示此命令的類型,主要有以下五種類型:
例如,我們經常使用的cd
命令,我們來執行下面的命令來看下它屬於哪種類型。
type cd
同時,為了查看更加詳細的資訊,可以使用
type -a cd
如果想查看的資訊更加簡潔和適合人們理解,可以使用如下命令和參數:
type -t ls
PATH 命令
Linux會檢查配置在 PATH 環境中的指定路徑的程式是否可以執行。通常情況下,目前的目錄是不會被尋找,除非你把它配置到PATH 中,我們可以執行如下命令,把目前的目錄加到 PATH 環境中。
export PATH=$PATH:.
接下來,我們建立一個存放 shell 指令碼的目錄bin,可以用如下命令來執行:
$ test -d $HOME/bin || mkdir $HOME/bin
當然你可以在你的主目錄下手動建立目錄 bin。上面的意思是檢查主目錄是否有 bin 目錄,沒有則建立。
建立指令碼
沒啥說的,學習每一種語言的第一個程式就是“Hello,World”,檔案名稱叫 hello1.sh。
#! /bin/bashecho "Hello World"exit 0
解釋一下:
#!/bin/bash
:通常情況下,指令碼的預設第一行代碼就是它。“#!”又被成為shebang。它用來告訴系統的解譯器來執行指令碼。除了 bash,我們還可以PHP,Perl等其他指令碼。
echo "Hello World"
:echo 是一個內建的命令,用來表示標準輸出,類似於 Java 中的System.out.println()
。
exit 0
:表示指令碼結束退出,exit
有一個整型參數,0表示正常退出,非0表示指令碼執行中有錯誤。
執行指令碼
現在,我們來執行上面的指令碼,你可以在命令列下,進入到指令檔存在的目錄,也可以是在任意目錄下,但是,在執行的時候,檔案的路徑就應該為絕對路徑:
bash $HOME/bin/hello1.sh
執行結果為,列印出“Hello world”。
Tip
在執行上面的命令中,可能會報錯,提示許可權不足或訪問拒絕的錯誤。這是因為 hello1.sh 沒有執行的許可權。所以我們使用如下命令給檔案加上對應的許可權。
chmod +x $HOME/bin/hello1.sh
指令碼中的一些特殊參數
在指令碼中,有些表示特殊含義的參數,下面列出常見的幾個:
參數標識符 |
含義 |
$0 |
檔案本身的名字 |
$1 |
表示位置的參數,第一個參數傳遞給指令碼 |
${10} |
在超過兩位元的參數時,使用大括弧限定起來 |
$# |
參數的個數 |
$* |
表示所有的參數 |
如下所示:
#! /bin/bashecho "file name $(basename $0)"echo "Hello $1"echo "Hello $*"echo "Args count: $#"exit 0
輸出的結果為:
重視引號的正確使用
到現在,我們使用了雙引號來包圍字串用於 echo 命令的輸出。
在第一個 Hello1.sh中,使用單引號還是雙引號,效果是一樣的。下面的兩行代碼是等效的。
echo "Hello World"echo ‘Hello World‘
但是,在包含有變數的引用時,單引號和雙引號的效果是不一樣的。
echo "Hello $1" // 列印傳遞的值,例如 Tim。echo ‘Hello $1‘ // 把$1原樣列印出來
所以,在有變數的字串裡,推薦使用雙引號。這時,$1就會被變數的值所替代,而不是作為字串顯示出來。
列印指令碼名字
前面提到過,特殊參數$0
用來表示指令碼的名字,這裡的名字會帶有完整的路徑,如果我們只想要檔案名稱的話,可以使用以下代碼:
echo "You are using $(basename $0)"
這裡$(….)文法的作用是我們先執行括弧裡面的命令,然後然後把結果賦給外面不知名的變數。
$(….)文法還有一種相等的寫法,注意,是鍵盤上數字1左邊的按鍵,不是單引號。
echo "You are using `basename $0`"
個人不推薦這種寫法,太容易混淆,不容易差錯。
調試你的指令碼
如果想調試你的指令碼,bash給我們提供了兩個選項:-v 和-x。
如果我們想逐行詳細地查看指令碼的內容,可以使用-v 選項。
#! /bin/bashecho "file name $(basename $0)"echo "Hello $1"echo "Hello $*"echo "Args count: $#"exit 0
更常用的是-x 選項,它們在執行時顯示命令。當我們決定選擇分支的時候,更加使用。
可以看到,basename
最先執行了,使用此選項不會看到代碼的詳情。
Linux Shell——bash shell 指令碼簡介