Shell腳本【5】Shell 內置命令(alias、echo、read、exit、declare)

內置命令

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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章