『忘了再學』Shell基礎 — 17、預定義變數

繁華似錦Fighting發表於2022-05-24

我們之前說過,Shell中的變數不是按照變數值的型別來進行分類的,而是按照Linux系統中定義的變數類別來分類的。

預定義變數就是,事先把變數的名稱和作用確定好(都是不可變的),只能修改變數的內容,也就是變數的值。

其實預定義變數和位置引數變數都可以統稱為預定義變數(有分開說明的,也有一起說明的,知道就行)。

預定義變數如下:

預定義變數 作用
$? $?中存的值,是最後一次執行的命令的返回狀態。
如果這個變數的值為0,證明上一個命令正確執行;
如果這個變數的值為非0(具體是哪個數,由命令自己來決定),
則證明上一個命令執行不正確了。(常用)
$$ 當前程式的程式號(PID)。
$! 後臺執行的最後一個程式的程式號(PID)。

1、預定義變數$?

$?這個預定義變數,在我們寫Shell指令碼的時候,還是比較常用。

我們下邊來寫一個例子進行說明。

# 執行ls命令
# ls命令正確執行
[root@Lyl tmp]# ls
count.sh  for.sh  parameter.sh  param.sh

# 預定義變數"$?"的值是0,證明上一個命令執行正確,
# "$?"記錄的是在執行"$?",或者值查詢"$?"之前,
# 最後一條命令的執行返回狀態。
[root@Lyl tmp]# echo $?
0


# 當前目錄中沒有install.log檔案,所以ls命令報錯了。
[root@Lyl tmp]# ls install.log
ls: 無法訪問install.log: 沒有那個檔案或目錄

# 變數"$?"返回一個非0的值,證明上一個命令沒有正確執行,
# 至於錯誤的返回值到底是多少,是在編寫ls命令時定義好的,
# 如果碰到檔案不存在就返回數值2。
[root@Lyl tmp]# echo $?
2

# 輸出錯誤命令的時候,命令狀態返回值一般都是127。
[root@Lyl tmp]# adfasdf
-bash: adfasdf: command not found
[root@Lyl tmp]# echo $?
127

預定義變數$?的常用使用方式:

比如在寫一個指令碼的時候,要判斷apache服務是否在執行。

有很多種實現方式,

比如搜尋Linux系統中是否有apache服務的程式id號,如果能找到,$?的返回值為0,就確認了apache服務正在執行。

如果$?值不等於0,則證明apache服務沒有啟動。

有一個例子,我們前邊在說Bash多命令順序執行的時候,文章如下:

https://www.cnblogs.com/liuyuelinfighting/p/16082830.html

判斷的條件就是$?=0

2、預定義變數$$$!

預定義變數$$$!,在實際工作中用的不多,瞭解一下。(但是都要記住)

Linux系統下的程式是依賴程式的id號進行區分的,叫做pid,也就是程式id

# 定義一個指令碼variable.sh
[root@Lyl tmp]# variable.sh

# 指令碼內容如下:

#!/bin/bash

# 輸出當前程式的PID。
# 這個PID就是variable.sh這個指令碼執行時,生成的程式的PID。
echo "The current process is $$"

# 使用find命令在root目錄下查詢hello.sh檔案
# 符號&的意思是把命令放入後臺執行。
find /root -name hello.sh &

# 輸出這個後臺執行命令的程式的PID,
# 也就是輸出find命令的PID號
echo "The last one Daemon process is $!"

提示:將命令放入後臺執行,請檢視文章:https://www.cnblogs.com/liuyuelinfighting/p/15710694.html

相關文章