狀態(tài)變量
變量 | 含義 | 應(yīng)用場(chǎng)景 |
---|---|---|
$? | 上一條命令的返回值 | 判斷命令的執(zhí)行是否成功 |
$$ | 用于獲取當(dāng)前shell環(huán)境的進(jìn)程ID號(hào) | 在腳本運(yùn)行時(shí)將pid記錄到文件中,方便kill |
$! | 記錄上一個(gè)腳本運(yùn)行的pid,很少用 | |
$_ | 上一個(gè)命令或者腳本的最后一個(gè)參數(shù) | 類似于ESC + . |
$?:用來(lái)獲取上一個(gè)命令或函數(shù)的返回值。 (通過(guò)返回值,可以進(jìn)行判斷)
##通常命令執(zhí)行成功返回0,失敗返回值為其他數(shù)字,比如
[root@m01 ~]# cat 1.txt
cat: 1.txt: No such file or directory
[root@m01 ~]# echo $?
1
[root@m01 ~]# ll hvbjhj
ls: cannot access hvbjhj: No such file or directory
[root@m01 ~]# echo $?
2 因?yàn)閘s程序里寫(xiě)了返回值是2
#例:檢查域名能否ping通
[root@m01 ~]# vim 1.sh
#!/bin/bash
ping -c 1 -w 2 -i 0.1 www.bAIdu.com &>/dev/null
echo $?
[root@m01 ~]# sh 1.sh
0
##注意:并不是所有命令執(zhí)行成功都返回0,所以我們?cè)谧雠袛嘀埃欢ㄒ诿钚袌?zhí)行一遍,確認(rèn)一下。例如
[root@localhost ~]# echo 111 > 1.txt
[root@localhost ~]# echo 111 > 2.txt
[root@localhost ~]# diff 1.txt 2.txt
[root@localhost ~]# echo $? //文件相同時(shí)返回0
0
[root@localhost ~]# echo 222 > 2.txt
[root@localhost ~]# diff 1.txt 2.txt
1c1
< 111
---
> 222
[root@localhost ~]# echo $? //文件不同時(shí)返回1
1
$$:可以記錄當(dāng)前腳本運(yùn)行的pid號(hào),方便kill
# 例1:獲取當(dāng)前shell環(huán)境的進(jìn)程ID號(hào)
[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:記錄當(dāng)前腳本運(yùn)行的pid號(hào)
[root@m01 ~]# vim 1.sh
#!/bin/bash
echo $$
sleep 10
[root@m01 ~]# sh 1.sh
37817
[root@m01 ~]# ps -ef|grep 1.sh
root 37817 37736 0 22:38 pts/3 00:00:00 sh 1.sh
# 例3:5秒備份一次的腳本,定時(shí)任務(wù)滿足不了
#!/bin/bash
echo $$ > /var/run/backup.pid #//記錄pid號(hào)到/var/run/下
while true;do
echo '備份中...'
cp /etc/passwd /tmp/passwd_$(date +%F-%T)
sleep 5
done
[root@m01 ~]# sh 1.sh
備份中...
備份中...
備份中...
備份中...
備份中...
[root@m01 /tmp]# ll
total 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+.一個(gè)效果。記錄上一條命令,以空格為分隔符的最后一部分內(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+.便出來(lái)上條的后半部分)
位置變量
符號(hào) | 含義 | 應(yīng)用場(chǎng)景 |
---|---|---|
$0 | 腳本名字 | 腳本錯(cuò)誤提示或者提示幫助時(shí) |
$n | 腳本的第n個(gè)參數(shù) | 傳參給腳本,在腳本中使用 |
$# | 統(tǒng)計(jì)腳本參數(shù)的個(gè)數(shù) | 判斷腳本傳參個(gè)數(shù) |
$* | 接收腳本后所有的參數(shù) | 將所有參數(shù)當(dāng)成是一個(gè)整體,對(duì)傳遞的參數(shù)進(jìn)行判斷 |
$@ | 接收腳本后所有的參數(shù) | 將所有參數(shù)當(dāng)成是一個(gè)整體,對(duì)傳遞的參數(shù)進(jìn)行判斷 |
$0
# 腳本的幫助/錯(cuò)誤提示
[root@m01 ~]# /etc/init.d.NETwork //這個(gè)是network的啟動(dòng)腳本
Usage: /etc/init.d/network {start|stop|status|restart|force-reload}
[root@m01 ~]# /etc/init.d/network start
Starting network (via systemctl): [ OK ]
# 自己實(shí)現(xiàn)腳本的幫助/錯(cuò)誤提示
[root@m01 ~]# vim 1.sh
#!/bin/bash
echo $0
[root@m01 ~]# sh 1.sh
1.sh
[root@m01 ~]# vim 1.sh
#!/bin/bash
echo "Usage: $0 {start|stop|status|restart|force-reload}"
[root@m01 ~]# sh 1.sh
Usage: 1.sh {start|stop|status|restart|force-reload}
# 腳本完善,使用$#
vim usage.sh
#!/bin/bash
if [ $# -eq 0 ];then
echo "Usage: $0 {start|stop|restart}"
else
echo $1
fi
[root@m01 ~]# sh usage.sh
Usage: usage.sh {start|stop|restart}
[root@m01 ~]# sh usage.sh start
start
$n:用于給腳本傳參
# 運(yùn)行 Shell 腳本文件時(shí)我們可以給它傳遞一些參數(shù),這些參數(shù)在腳本文件內(nèi)部可以使用$n的形式來(lái)接收。
第n個(gè)參數(shù),用$n接收
# 例
[root@m01 ~]# vim 1.sh
#!/bin/bash
echo $1 $2 $3 $4 $5
[root@m01 ~]# sh 1.sh 1 2 3 4 5
1 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/bash
echo $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/bash
echo $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)計(jì)腳本傳遞了幾個(gè)參數(shù),讓腳本更嚴(yán)謹(jǐn)
# 例
#!/bin/bash
num1=$1
num2=$2
echo $num1
echo $num2
echo $#
[root@m01 ~]# sh 1.sh 1 2 3 4
1
2
4
$*和$@
$*和$@:接收腳本后面?zhèn)鬟f的所有參數(shù)。主要用于當(dāng)傳遞參數(shù)較多的情況。
正常情況下,這兩個(gè)變量是沒(méi)有區(qū)別的。用循環(huán)的時(shí)候才和$@區(qū)別
# 例子
#!/bin/bash
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 z
26
#!/bin/bash
echo $@
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 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 z
26
## 兩者區(qū)別:用for循環(huán)時(shí)$*加了引號(hào)變橫排,僅此而已
[root@m01 ~]# vim 4.sh
#!/bin/bash
echo '$@輸出結(jié)果如下:'
for num1 in "$@";do
echo $num1
done
echo '$*輸出結(jié)果如下:'
for num2 in "$*";do
echo $num2
done
[root@m01 ~]# sh 4.sh 1 2 3 4 5
$@輸出結(jié)果如下:
1
2
3
4
5
$*輸出結(jié)果如下:
1 2 3 4 5