1. 程式人生 > >Linux Shell——bash shell 腳本簡介

Linux Shell——bash shell 腳本簡介

運行環境 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命令會根據你輸入的單詞來顯示此命令的類型,主要有以下五種類型:

  • 別名

  • 方法

  • shell 內置命令

  • 關鍵字

  • 文件

例如,我們經常使用的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 腳本簡介