bash的內置命令和外部命令的使用方法相同,咱們已經介紹了一部份內置命令的用法,本文接着介紹另外一些經常使用內置命令的用法。linux
:
此命令的執行沒有任何效果,但在命令執行前會進行參數擴展和重定向。命令返回值爲0。shell
舉例:vim
#!/bin/bash #能夠用在while複合命令中造成一個死循環 while : do cmd done #固然內置命令:能夠換成任何返回值爲0的命令,如: while true do cmd done #或者 until false do cmd done #例如,判斷一個變量值是否爲空,若是爲空則退出腳本: : ${parameter:?$(echo -en "\033[40;36m變量值爲空,請正確設置變量!\033[0m")} #爲實現相似的效果,寫成if語句則形如: if [ ! ${parameter} ];then echo -e "\033[40;36m變量值爲空,請正確設置變量!\033[0m" exit 2 fi #還能夠利用:配合Here Documents做爲多行註釋: : <<EOF some comment1 some comment2 some comment3 EOF
.
source
這兩個內置命令執行效果相同。表示在當前環境下(不啓動子進程)執行其後的文件。
由於是在當前環境中執行文件內容,該文件並不須要具有可執行權限,執行完畢後,在文件內部聲明的變量或定義的函數能夠在當前環境中直接使用。windows
eval
內置命令eval
後面的參數會先讀取並組合成一個命令,而後再次讀取並執行這個命令,這個命令的返回值做爲eval命令的返回值返回。
舉例:centos
#!/bin/bash NUM=100 #第一次讀取時,因爲大括號內部不是合法的序列表達式因此保持原樣擴展。 #但單詞$NUM會通過變量擴展,結果爲 {01..100..5}。 #第二次再次讀取命令並執行,這時大括號就能正確擴展了。 for i in `eval echo {01..$NUM..5}` do echo $i done ###################################### array=(aa bb cc dd) aa=1 bb=2 cc=3 dd=4 #第一次掃描時變量擴展爲$aa $bb $cc $dd #第二次執行時被替換爲各個變量的值 eval echo ${array[*]/#/$}
hash
bash中執行的外部命令會被緩存在一個哈希表中,直接執行命令hash
能夠查看當前bash緩存了哪些外部命令:緩存
[root@centos7 ~]# hash 命中 命令 5 /usr/bin/grep 2 /usr/bin/df 15 /usr/bin/vim 8 /usr/bin/ls [root@centos7 ~]#
選項-d name
能夠刪除緩存內名爲name的記錄bash
[root@centos7 ~]# hash -d vim [root@centos7 ~]# hash 命中 命令 5 /usr/bin/grep 2 /usr/bin/df 8 /usr/bin/ls [root@centos7 ~]#
help
外部命令經過man
查看幫助手冊,內置命令經過help
:函數
[root@centos7 ~]# help eval eval: eval [參數 ...] 將參數做爲 shell 命令執行。 將 ARGs 合成一個字符串,用結果做爲 shell 的輸入, 而且執行獲得的命令。 退出狀態: 以命令的狀態退出,或者在命令爲空的狀況下返回成功。
shopt
設置或取消設置shell選項,這些選項都是用來控制shell行爲的。
選項-s
表示啓用選項
選項-u
表示禁用選項
選項-p
表示顯示可用選項
舉例:centos7
#!/bin/bash #開啓shell擴展通配符選項 shopt -s extglob # 擴展通配符可以匹配pattern-list,此列表是以符號|分隔的多個pattern,這些pattern之間是或者的關係 # ?(pattern-list) 表示匹配列表中零到一個pattern # *(pattern-list) 表示匹配列表中零到多個pattern # +(pattern-list) 表示匹配列表中一到多個pattern # @(pattern-list) 表示匹配列表中其中一個pattern # !(pattern-list) 表示匹配任何一個非列表中的pattern case $1 in @(win-98|win-xp|win-7|win-10)) echo "windows";; @(Redhat*|Centos*|Debian*|Ubuntu*)) echo "linux";; *) echo "others";; esac
執行:調試
[root@centos7 temp]# ./test.sh centos123 others [root@centos7 temp]# ./test.sh Centos123 linux [root@centos7 temp]#
type
顯示命令類型:
[root@centos7 temp]# type ls ls 是 `ls --color=auto' 的別名 [root@centos7 temp]# type [ [ 是 shell 內嵌 [root@centos7 temp]# type [[ [[ 是 shell 關鍵字 [root@centos7 temp]# type awk awk 是 /usr/bin/awk [root@centos7 temp]#
trap
trap
命令用於在收到指定信號時執行指定操做。一種常見用途是在腳本程序被中斷時完成清理工做。
選項-l
用於顯示可用信號:
[root@centos7 ~]# trap -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
腳本舉例:
#!/bin/bash -x #在須要保護運行的代碼前設置忽略的信號: trap "echo 'protected'" 1 2 3 20 #或者 trap "echo 'protected'" HUP INT QUIT TSTP for((i=1;i<5;i++)) do sleep 0.5 done #保護代碼結束後恢復信號做用 trap HUP INT QUIT TSTP #生成臨時文件 touch tmp_file #設置收到信號意外終止時清理臨時文件 trap 'rm -f tmp_file;exit' INT while : do sleep 10 echo $i >> tmp_file done
執行:
[root@centos7 ~]# ./test.sh #開啓了調試模式(-x) + trap 'echo '\''protected'\''' 1 2 3 20 + (( i=1 )) + (( i<5 )) + sleep 0.5 + (( i++ )) + (( i<5 )) + sleep 0.5 ^C++ echo protected #此處執行CTRL+C,信號被忽略,並執行echo命令。 protected + (( i++ )) + (( i<5 )) + sleep 0.5 + (( i++ )) + (( i<5 )) + sleep 0.5 + (( i++ )) + (( i<5 )) + trap HUP INT QUIT TSTP + touch tmp_file + trap 'rm -f tmp_file;exit' INT #恢復信號功能後從新設置CTRL+C的信號處理 + : + sleep 10 ^C++ rm -f tmp_file #此時執行CTRL+C後,執行刪除臨時文件並退出腳本。 ++ exit [root@centos7 ~]#
ulimit
ulimit
命令用來控制進程對系統資源的使用,這些限制僅僅適用於當前shell進程及其子進程。
選項-a
顯示全部當前的資源限制:
[root@centos7 ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 31209 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 31209 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
輸出中每行表示一種限制,括號中的內容是單位和修改此限制須要使用的選項。文件/etc/security/limits.conf
中解釋了每一項都表明什麼。
選項-H
和-S
分別表示設置或顯示硬限制和軟限制,硬限制
表示實際限制,超過會報錯。軟限制
並非嚴格限制,超過會有警告信息。
在設置時若是不指定-H
或-S
表示同時設置硬限制和軟限制。ulimit
更改設置只在當前會話有效,如須要在系統級別有效須要更改配置文件/etc/security/limits.conf
或目錄/etc/security/limits.d
內文件。