
狀態(tài)變量
| 變量 | 含義 | 應(yīng)用場景 |
|---|---|---|
| $? | 上一條命令的返回值 | 判斷命令的執(zhí)行是否成功 |
| $$ | 用于獲取當前shell環(huán)境的進程ID號 | 在腳本運行時將pid記錄到文件中,方便kill |
| $! | 記錄上一個腳本運行的pid,很少用 | |
| $_ | 上一個命令或者腳本的最后一個參數(shù) | 類似于ESC + . |
$?:用來獲取上一個命令或函數(shù)的返回值。 (通過返回值,可以進行判斷)
##通常命令執(zhí)行成功返回0,失敗返回值為其他數(shù)字,比如[root@m01 ~]# cat 1.txtcat: 1.txt: No such file or directory[root@m01 ~]# echo $?1[root@m01 ~]# ll hvbjhjls: cannot access hvbjhj: No such file or directory[root@m01 ~]# echo $?2 因為ls程序里寫了返回值是2#例:檢查域名能否ping通[root@m01 ~]# vim 1.sh#!/bin/bashping -c 1 -w 2 -i 0.1 www.bAIdu.com &>/dev/nullecho $?[root@m01 ~]# sh 1.sh0##注意:并不是所有命令執(zhí)行成功都返回0,所以我們在做判斷之前,一定要在命令行執(zhí)行一遍,確認一下。例如[root@localhost ~]# echo 111 > 1.txt[root@localhost ~]# echo 111 > 2.txt[root@localhost ~]# diff 1.txt 2.txt[root@localhost ~]# echo $? //文件相同時返回00[root@localhost ~]# echo 222 > 2.txt[root@localhost ~]# diff 1.txt 2.txt1c1< 111---> 222[root@localhost ~]# echo $? //文件不同時返回11
$$:可以記錄當前腳本運行的pid號,方便kill
# 例1:獲取當前shell環(huán)境的進程ID號[root@m01 ~]# echo $$37736[root@m01 ~]# pstree -p|grep bash|-sshd(8565)-+-sshd(20719)---bash(20721)| |-sshd(21865)---bash(21867)| |-sshd(23197)---bash(23199)| |-sshd(37734)---bash(37736)-+-grep(38195)...# 例2:記錄當前腳本運行的pid號[root@m01 ~]# vim 1.sh#!/bin/bashecho $$sleep 10[root@m01 ~]# sh 1.sh37817[root@m01 ~]# ps -ef|grep 1.shroot 37817 37736 0 22:38 pts/3 00:00:00 sh 1.sh# 例3:5秒備份一次的腳本,定時任務(wù)滿足不了#!/bin/bashecho $$ > /var/run/backup.pid #//記錄pid號到/var/run/下while true;doecho '備份中...'cp /etc/passwd /tmp/passwd_$(date +%F-%T)sleep 5done[root@m01 ~]# sh 1.sh備份中...備份中...備份中...備份中...備份中...[root@m01 /tmp]# lltotal 540-rw-r--r-- 1 root root 1470 Nov 7 23:08 passwd_2023-11-07-23:08:10-rw-r--r-- 1 root root 1470 Nov 7 23:08 passwd_2023-11-07-23:08:15-rw-r--r-- 1 root root 1470 Nov 7 23:08 passwd_2023-11-07-23:08:20-rw-r--r-- 1 root root 1470 Nov 7 23:08 passwd_2023-11-07-23:08:25...
$_
$_:和ESC+.一個效果。記錄上一條命令,以空格為分隔符的最后一部分內(nèi)容。[root@localhost ~]# ll /etc/passwd-rw-r--r--. 1 root root 906 Oct 9 15:30 /etc/passwd[root@localhost ~]# /etc/passwd (此處按ESC+.便出來上條的后半部分)
位置變量
| 符號 | 含義 | 應(yīng)用場景 |
|---|---|---|
| $0 | 腳本名字 | 腳本錯誤提示或者提示幫助時 |
| $n | 腳本的第n個參數(shù) | 傳參給腳本,在腳本中使用 |
| $# | 統(tǒng)計腳本參數(shù)的個數(shù) | 判斷腳本傳參個數(shù) |
| $* | 接收腳本后所有的參數(shù) | 將所有參數(shù)當成是一個整體,對傳遞的參數(shù)進行判斷 |
| $@ | 接收腳本后所有的參數(shù) | 將所有參數(shù)當成是一個整體,對傳遞的參數(shù)進行判斷 |
$0
# 腳本的幫助/錯誤提示[root@m01 ~]# /etc/init.d.NETwork //這個是network的啟動腳本Usage: /etc/init.d/network {start|stop|status|restart|force-reload}[root@m01 ~]# /etc/init.d/network startStarting network (via systemctl): [ OK ]# 自己實現(xiàn)腳本的幫助/錯誤提示[root@m01 ~]# vim 1.sh#!/bin/bashecho $0[root@m01 ~]# sh 1.sh1.sh[root@m01 ~]# vim 1.sh#!/bin/bashecho "Usage: $0 {start|stop|status|restart|force-reload}"[root@m01 ~]# sh 1.shUsage: 1.sh {start|stop|status|restart|force-reload}# 腳本完善,使用$#vim usage.sh#!/bin/bashif [ $# -eq 0 ];thenecho "Usage: $0 {start|stop|restart}"elseecho $1fi[root@m01 ~]# sh usage.shUsage: usage.sh {start|stop|restart}[root@m01 ~]# sh usage.sh startstart
$n:用于給腳本傳參
# 運行 Shell 腳本文件時我們可以給它傳遞一些參數(shù),這些參數(shù)在腳本文件內(nèi)部可以使用$n的形式來接收。第n個參數(shù),用$n接收# 例[root@m01 ~]# vim 1.sh#!/bin/bashecho $1 $2 $3 $4 $5[root@m01 ~]# sh 1.sh 1 2 3 4 51 2 3 4 5[root@m01 ~]# sh 1.sh {1..6}1 2 3 4 5[root@m01 ~]# sh 1.sh {a..h}a b c d e# $10 以后,需要加{}[root@m01 ~]# vim 1.sh#!/bin/bashecho $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11[root@m01 ~]# sh 1.sh {a..l}a b c d e f g h i a0 a1[root@m01 ~]# sh 1.sh {1..11}1 2 3 4 5 6 7 8 9 10 11[root@m01 ~]# vim 1.sh#!/bin/bashecho $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}[root@m01 ~]# sh 1.sh {a..l}a b c d e f g h i j k
$#:統(tǒng)計腳本傳遞了幾個參數(shù),讓腳本更嚴謹
# 例#!/bin/bashnum1=$1num2=$2echo $num1echo $num2echo $#[root@m01 ~]# sh 1.sh 1 2 3 4124
$*和$@
$*和$@:接收腳本后面?zhèn)鬟f的所有參數(shù)。主要用于當傳遞參數(shù)較多的情況。正常情況下,這兩個變量是沒有區(qū)別的。用循環(huán)的時候才和$@區(qū)別# 例子#!/bin/bashecho $@echo $#[root@m01 ~]# sh 1.sh {a..z}a b c d e f g h i j k l m n o p q r s t u v w x y z26#!/bin/bashecho $@echo $*echo $#[root@m01 ~]# sh 1.sh {a..z}a b c d e f g h i j k l m n o p q r s t u v w x y za b c d e f g h i j k l m n o p q r s t u v w x y z26## 兩者區(qū)別:用for循環(huán)時$*加了引號變橫排,僅此而已[root@m01 ~]# vim 4.sh#!/bin/bashecho '$@輸出結(jié)果如下:'for num1 in "$@";doecho $num1doneecho '$*輸出結(jié)果如下:'for num2 in "$*";doecho $num2done[root@m01 ~]# sh 4.sh 1 2 3 4 5$@輸出結(jié)果如下:12345$*輸出結(jié)果如下:1 2 3 4 5






