1. shell的簡單介紹
Shell簡單說既是提供用戶操作系統的接口。Linux默認使用的shell就是 bash。你可以通過查看 "/etc/shells" 這個文件來檢查我們目前的機器上可以支持使用的shell啦。
如果你想查看你這個用戶使用的是哪個shell的話,你可以查看 "etc/passwd" 文件,每行的最后標出來的就是這個用戶所使用的shell啦。
/bin/bash 是 Linux 默認的 shell,bash 是 GNU 計划中重要的工具軟件之一,目前也是 Linux distributions 的標准 shell。bash 主要兼容於 sh ,並且依據一些使用者需求,而加強的 shell 版本。
bash 主要的優點有底下幾個:
-
- 命令記憶能力(history)
簡單說就是會記錄我們的歷史命令,這些命令記錄你可以在你的主文件夾內的 .bash_history 中找到。
-
- 命令與文件補全功能([Tab]按鍵的好處)
[Tab] 接在一串命令的第一個字的后面,則為命令補全;[Tab] 接在一串命令的第二個字以后時,則為文件補齊。
-
- 命令別名設置功能(alias)
比如你在命令行敲下 "alias lm='ls -al'" 那么你就可以通過 lm 命令來代替 ls -al 命令了。
-
- 作業控制、前台、后台控制(job control, foreground, background)
- 程序腳本(shell script)
- 通配符(Wildcard)
2. bash shell 的內置命令 -- type
為了方便 shell 的操作,bash 內建了很多命令,如果你想確定某個命令是來自於外部命令(其他非bash所提供的命令)或是內置在bash當中的,你可以使用type這個命令來查看:
[root@www ~]# type [-tpa] name 選項與參數: :不加任何選項與參數時,type 會顯示出 name 是外部命令還是 bash 內建命令 -t :type 會將 name 以底下這些字眼顯示出它的意義: file :表示為外部命令; alias :表示該命令為命令別名所配置的名稱; builtin :表示該命令為 bash 內建的命令功能; -p :如果后面接的 name 為外部命令時,才會顯示完整文件名; -a :會由 PATH 變量定義的路徑中,將所有含 name 的命令都列出來,包含 alias 例一:查詢一下 ls 這個命令是否為 bash 內建 [root@www ~]# type ls ls is aliased to `ls --color=tty'
3. shell的變量功能
3.1 變量的顯示與設置 echo, unset
利用 echo 這個命令來取用變量,變量被取用時,前面必須要加上錢字號 $ ,例如:
[root@www ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@www ~]# echo ${PATH} <==也可以使用這種方式
那變量如何設置,如下所示:
[root@www ~]# myname=VBird
我們在配置變量時,需要遵循以下守則:
-
- 變量名稱只能是英文字母與數字,但是數字不能作開頭字符;
- 變量內容若有空格符可使用雙引號 [ " ] 或單引號 [ ' ] 將變量內容包含起來;
- 可用跳脫字符[ \ ] 將特殊符號(如 [Enter], $, \, 空格符, '等)變成一般字符;
- 在一串命令中,還需要根據其他的命令提供信息時,可以使用反單引號[ `命令` ]或 [ $(命令) ]。特別注意,這個 ` 是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引號;
- 若該變量為擴增變量內容時,則可用 "$變量名稱" 或 ${變量} 累加內容,比如 PATH="$PATH":/home/bin;
- 若該變量需要在其他子程序運行,則需要以 export 來使變量變成環境變量,比如 export PATH;
- 取消變量的方法為使用 unset ,[ unset 變量名稱 ] ,比如取消 myname 的配置,則為 unset myname;
3.2 環境變量的功能
可以使用 env 或 export 命令來查看我們系統目前存在的環境變量。
可以使用 set 查看所有變量(包含環境變量與自定義變量)。
可以使用 export 命令將自定義變量轉為環境變量。
[root@www ~]# export 變量名稱
3.3 變量的有效范圍
操作系統中分環境變量與自定義變量,這兩個主要區別就是,子進程中訪問不到父進程中定義的自定義變量,但是可以訪問到環境變量。
3.4 變量的鍵盤讀取、數組與聲明: read, array, declare
需要讀取來自鍵盤輸入的變量,可以使用 read 命令:
[root@www ~]# read [-pt] variable 選項與參數: -p :后面可以接提示字符 -t :后面可以接等待的秒數 例一:讓用戶由鍵盤輸入一內容,將該內容變成名為 atest 的變量 [root@www ~]# read atest This is a test <==此時光標會等待你輸入!請輸入左側文字看看 [root@www ~]# echo $atest This is a test <==你剛剛輸入的數據已經變成一個變量內容! 范例二:提示使用者 30 秒內輸入自己的大名,將該輸入字符串作為名為 named 的變量內容 [root@www ~]# read -p "Please keyin your name: " -t 30 named Please keyin your name: Tsai <==注意看,會有提示字符喔! [root@www ~]# echo $named Tsai <==輸入的數據又變成一個變量的內容了!
declare / typeset 是一樣的功能,就是聲明變量的類型
[root@www ~]# declare [-aixr] variable 選項與參數: -a :將后面名為 variable 的變量定義成為數組 (array) 類型 -i :將后面名為 variable 的變量定義成為整數數字 (integer) 類型 -x :用法與 export 一樣,就是將后面的 variable 變成環境變量; -r :將變量配置成為 readonly 類型,該變量不可被更改內容,也不能 unset 例一:讓變量 sum 進行 100+300+50 的加總結果 [root@www ~]# sum=100+300+50 [root@www ~]# echo $sum 100+300+50 <==因為這是文字型態的變量屬性,所有並沒有相加 [root@www ~]# declare -i sum=100+300+50 [root@www ~]# echo $sum 450
數組變量的類型
數組的設置方式: var[index]=content
3.5 變量內容的刪除、替代與替換
變量配置方式 | 說明 |
${變量#關鍵詞} ${變量##關鍵詞} |
若變量內容從頭開始的數據符合“關鍵詞”,則將符合的最短數據刪除 若變量內容從頭開始的數據符合“關鍵詞”,則將符合的最長數據刪除 若變量內容從頭開始的數據符合“關鍵詞”,則將符合的最短數據刪除 若變量內容從頭開始的數據符合“關鍵詞”,則將符合的最長數據刪除 |
${變量%關鍵詞} ${變量%%關鍵詞} |
若變量內容從尾向前的數據符合“關鍵詞”,則將符合的最短數據刪除 若變量內容從尾向前的數據符合“關鍵詞”,則將符合的最長數據刪除 |
${變量/舊字符串/新字符串} ${變量//舊字符串/新字符串} |
若變量內容符合“舊字符串”則“第一個舊字符串會被新字符串取代” 若變量內容符合“舊字符串”則“全部的舊字符串會被新字符串取代” |
4. Bash Shell的操作環境
4.1 通配符與特殊符號
符號 | 意義 |
* | 代表0 個到無窮多個任意字符 |
? | 代表一定有一個任意字符 |
[] | 代表一定有一個在括號內的字符(非任意字符)。例如 [abcd] 代表一定有一個字符, 可能是 a, b, c, d 這四個任何一個 |
[-] | 若有減號在中括號內時,代表在編碼順序內的所有字符。例如 [0-9] 代表 0 到 9 之間的所有數字,因為數字的語系編碼是連續的 |
[^] | 若中括號內的第一個字符為指數符號 (^) ,那表示反向選擇,例如 [^abc] 代表 一定有一個字符,只要是非 a, b, c 的其他字符就接受 |