SHELL(bash)腳本編程五:內置命令

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內文件。

相關文章
相關標籤/搜索