Shell 內建命令
內置命令
Shell 內置命令,就是由 Bash 自身提供的命令,而不是文件系統中的某個可執行文件。
pwd 是一個 Shell 內置命令,該命令並不是某個外部文件,只要在 Shell 中就一定可以運行這個命令。而 ip 是一個外部文件,它的位置是/usr/sbin/ip
[root@system ~]# type pwd
pwd is a shell builtin
[root@system ~]# type ip
ip is /usr/sbin/ip
系統變量 $PATH 包含的目錄中幾乎聚集了系統中絕大多數的可執行命令,它們都是外部命令。
[root@system1 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
通常來說,內置命令會比外部命令執行得更快,執行外部命令時不但會觸發磁盤 I/O,還需要 fork 出一個單獨的進程來執行,執行完成後再退出。而執行內置命令相當於調用當前 Shell 進程的一個函數。
常用的Bash Shell 內置命令
命令 | 說明 |
---|---|
. | 讀取並執行指定文件中的命令(在當前 shell 環境中) |
alias | 爲指定命令定義一個別名 |
bg | 將作業以後臺模式運行 |
fg | 將作業以前臺模式運行 |
break | 退出 for、while、select 或 until 循環 |
declare | 聲明一個變量或變量類型。 |
cd | 將當前目錄切換爲指定的目錄 |
command | 執行指定的命令,無需進行通常的 shell 查找 |
continue | 繼續執行 for、while、select 或 until 循環的下一次迭代 |
echo | 將指定字符串輸出到 STDOUT |
enable | 啓用或禁用指定的內建shell命令 |
exec | 用指定命令替換 shell 進程 |
exit | 強制 shell 以指定的退出狀態碼退出 |
export | 設置子 shell 進程可用的變量 |
help | 顯示幫助文件 |
history | 顯示命令歷史記錄 |
jobs | 列出活動作業 |
kill | 向指定的進程 ID(PID) 發送一個系統信號 |
printf | 使用格式化字符串顯示文本 |
pwd | 顯示當前工作目錄的路徑名 |
read | 從 STDIN 讀取一行數據並將其賦給一個變量 |
readonly | 從 STDIN 讀取一行數據並將其賦給一個不可修改的變量 |
return | 強制函數以某個值退出,這個值可以被調用腳本提取 |
set | 設置並顯示環境變量的值和 shell 屬性 |
source | 讀取並執行指定文件中的命令(在當前 shell 環境中) |
times | 顯示累計的用戶和系統時間 |
type | 顯示指定的單詞如果作爲命令將會如何被解釋 |
typeset | 聲明一個變量或變量類型。 |
umask | 爲新建的文件和目錄設置默認權限 |
unalias | 刪除指定的別名 |
unset | 刪除指定的環境變量或 shell 屬性 |
wait | 等待指定的進程完成,並返回退出狀態碼 |
alias命令:自定義別名
alisa 用來給命令創建一個別名。若直接輸入該命令且不帶任何參數,則列出當前 Shell 進程中使用了哪些別名。如:ll就是ls -l的命令別名
定義格式:
alias 別名='命令'
示例:
定義cd /etc命令別名haha
[root@system ~]# alias haha='cd /etc'
[root@system ~]# haha
[root@system etc]#
定義date命令的別名xixi
[root@system1 ~]# alias xixi='date'
[root@system1 ~]# xixi
Sun May 31 22:45:02 CST 2020
在代碼中使用 alias 命令定義的別名只能在當前 Shell 進程中使用,在子進程和其它進程中都不能使用。當前 Shell 進程結束後,別名也隨之消失。
要想讓別名對所有的 Shell 進程都有效,就得把別名寫入 Shell 配置文件。可以把別名命令寫入到/etc/bashrc文件中,/etc/bashrc文件爲每一個運行bash shell 的用戶均執行此文件.當bash shell被打開時,該文件被讀取.
unalias命令:刪除別名
使用 unalias 內建命令可以刪除當前 Shell 進程中的別名。unalias 有兩種使用方法:
- 第一種用法是在命令後跟上某個命令的別名,用於刪除指定的別名。
- 第二種用法是在命令後接-a參數,刪除當前 Shell 進程中所有的別名。
這兩種方法都是在當前 Shell 進程中生效的。要想永久刪除配置文件中定義的別名,只能進入該文件手動刪除
[root@system1 ~]# unalias ll #刪除ll別名
[root@system1 ~]# ll
bash: ll: command not found... #運行命令時找不到了
[root@system1 ~]# ls -l
total 52
echo 命令:終端輸出字符串
echo 是一個 Shell 內建命令,用來在終端輸出字符串,並在最後默認加上換行符。
可用選項
-n 不在最後自動換行
-e 啓用反斜線控制字符的轉換
-E 不處理轉義字符,默認選項
轉義符
\a 從系統喇叭發送聲音
\b 向左刪除
\c 取消行末的換行符號
\E ESCAPE鍵
\f 換頁字符
\n 換行字符
\r 回車鍵
\t 製表符
\v 垂直製表符
\\ 反斜線本身
示例:
[root@system ~]# echo -e "a\tb\tc\nd\te\tf"
a b c
d e f
- 反引號實現命令
- 替換在單引號中的所有字符(包括元字符),保留原有字符含義
- 在一對雙引號中的字符(包括元字符),除了$、反引號和反斜線外,其他均保留原字符的含義
[root@rhel8 ~]# dlist='whoami'
[root@rhel8 ~]# echo "* $dlist end"
* whoami end
[root@rhel8 ~]# echo "`$dlist`"
root
[root@rhel8 ~]# echo "\$dlist"
$dlist
read命令:讀取從鍵盤輸入的數據
read 是 Shell 內置命令,用來從標準輸入中讀取數據並賦值給變量。如果沒有進行重定向,默認就是從鍵盤讀取用戶輸入的數據;如果進行了重定向,那麼可以從文件中讀取數據。
read 命令的用法爲:
read [-options] [variables]
options表示選項;variables表示用來存儲數據的變量,可以有一個,也可以有多個。
Shell read 命令支持的選項
選項 | 說明 |
---|---|
-a array | 把讀取的數據賦值給數組 array,從下標 0 開始。 |
-d delimiter | 用字符串 delimiter 指定讀取結束的位置,而不是一個換行符(讀取到的數據不包括 delimiter)。 |
-e | 在獲取用戶輸入的時候,對功能鍵進行編碼轉換,不會直接顯式功能鍵對應的字符。 |
-n num | 讀取 num 個字符,而不是整行字符。 |
-p prompt | 顯示提示信息,提示內容爲 prompt。 |
-r | 原樣讀取(Raw mode),不把反斜槓字符解釋爲轉義字符。 |
-s | 靜默模式(Silent mode),不會在屏幕上顯示輸入的字符。當輸入密碼和其它確認信息的時候,這是很有必要的。 |
-t seconds | 設置超時時間,單位爲秒。如果用戶沒有在指定時間內輸入完成,那麼 read 將會返回一個非 0 的退出狀態,表示讀取失敗。 |
-u fd | 使用文件描述符 fd 作爲輸入源,而不是標準輸入,類似於重定向。 |
示例:在指定時間內輸入密碼。
#!/bin/bash
if
read -t 10 -sp "Enter password 1>" pass1 && printf "\n" &&
read -t 10 -sp "Enter password 2>" pass2 && printf "\n" &&
[ $pass1 == $pass2 ]
then
echo "Valid passowrd"
else
echo "Invalid password"
fi
如果兩次輸入密碼相同,運行結果爲:
Enter password 1>
Enter password 2>
Valid password
如果兩次輸入密碼不同,運行結果爲:
Enter password 1>
Enter password 2>
Invalid password
如果第一次輸入超時,運行結果爲:
Enter password 1 > Invalid password
如果第二次輸入超時,運行結果爲:
Enter password 1>
Enter password 2> Invalid password
exit命令:退出當前進程
exit 是一個 Shell 內置命令,用來退出當前 Shell 進程,並返回一個退出狀態;使用$?可以接收這個退出狀態
exit 命令可以接受一個整數值作爲參數,代表退出狀態。如果不指定,默認狀態值是 0。一般情況下,退出狀態爲 0 表示成功,退出狀態爲非 0 表示執行失敗(出錯)了
示例:
#!/bin/bash
echo "befor exit"
exit 2
echo "after exit"
運行結果:
befor exit
exit 命令後,腳本執行就結束了,所以不會輸出after exit
declare命令:設置變量屬性
declare 命令的用法:
declare [+/-] [選項] [變量名=變量值]
其中,-表示設置屬性,+表示取消屬性
declare 命令選項有:
選項 | 含義 |
---|---|
-f [name] | 列出之前由用戶在腳本中定義的函數名稱和函數體。 |
-F [name] | 僅列出自定義函數名稱。 |
-g name | 在 Shell 函數內部創建全局變量。 |
-p [name] | 顯示指定變量的屬性和值。 |
-a name | 聲明變量爲普通數組。 |
-A name | 聲明變量爲關聯數組(支持索引下標爲字符串)。 |
-i name | 將變量定義爲整數型。 |
-r name[=value] | 將變量定義爲只讀(不可修改和刪除),等價於 readonly name。 |
-x name[=value] | 將變量設置爲環境變量,等價於 export name[=value]。 |
示例:
#!/bin/bash
declare -r n=10 #設置只讀變量
declare -i a b c #將多個變量聲明爲整數
a=1
b=2
c=$a+$b
echo $c
運行結果:3
顯示變量的屬性和值。
[root@system ~]# declare -r m=10
[root@system ~]# declare -p m
declare -r m="10"