Linux Shell——bash shell 腳本簡介
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 腳本簡介