我正在嘗試制作一個簡單的 bash 腳本來檢查是否可以執行 ping 命令(有互聯網),否則。
我已經有一個完美運行的代碼,它直接在 if 陳述句中檢查是否可以執行 ping 命令而不使用 /dev/null 進行輸出。
舊代碼:
#! /usr/bin/bash
YELLOW="\e[33m"
RED="\e[1;31m"
GREEN="\e[1;32m"
ENDCOLOR="\e[0m"
if ping -c 1 8.8.8.8 > /dev/null 2>&1; then
echo -e "${YELLOW}[*]${ENDCOLOR} You have Internet access."
else
echo -e "\n ${RED}[!]${ENDCOLOR} You don't have Internet access !"
echo -e "\n ${YELLOW}[*]${ENDCOLOR} Quitting webDirDiscover..."
exit 1
fi
現在我要做的是將命令 ping -c 1 8.8.8.8 存盤在一個名為 PING 的變數中。完成后,執行 if 陳述句并檢查結果。
問題是這樣做會回傳錯誤:
./webDirDiscover.sh: line 10: PING: command not found
當我認為 if 陳述句應該正常作業時。
當前代碼:
#! /usr/bin/bash
YELLOW="\e[33m"
RED="\e[1;31m"
GREEN="\e[1;32m"
ENDCOLOR="\e[0m"
PING=$(ping -c 1 8.8.8.8)
if $PING -eq 0; then
echo -e "${YELLOW}[*]${ENDCOLOR} You have Internet access."
else
echo -e "\n ${RED}[!]${ENDCOLOR} You don't have Internet access !"
echo -e "\n ${YELLOW}[*]${ENDCOLOR} Quitting webDirDiscover..."
exit 1
fi
除了解決這個簡單的腳本之外,這在執行更復雜的命令時會派上用場,從而獲得更直觀和視覺上令人愉悅的代碼。
uj5u.com熱心網友回復:
簡單的咒語
變數保存資料。函式保存代碼。不要將代碼放在 [string] 變數中!
更多資訊的來源/更進一步:StackExchange 上的綜合答案
關于變數存盤命令先進的口頭禪是使用陣列作為尖銳的 評論。
但是我個人不喜歡。如果我正在處理運行時資訊,我只會將陣列用于引數,而不是命令本身
我會使用函式,如下
使用函式第 1 部分
#!/usr/bin/env bash
# ...
# use descriptive function names
pingGoogleDnsOnce () {
ping -c 1 8.8.8.8
}
if pingGoogleDnsOnce >/dev/null; then
# do stuff
else
# do other stuff
fi
使用函式第 2 部分
#!/usr/bin/env bash
# ...
# use descriptive function names
pingGoogleDnsOnce () {
ping -c 1 8.8.8.8
}
# use descriptive function names
quietlyPingGoogleDnsOnce () {
pingGoogleDnsOnce >/dev/null
}
if quietlyPingGoogleDnsOnce; then
# do stuff
else
# do other stuff
fi
在這兩種情況下,都不需要在if-block 中明確地“檢查”任何內容。這-eq 0是不必要的
定義的函式可以像任何其他命令一樣使用。主體中最后執行的命令的退出代碼是函式的退出代碼。
所以如果ping失敗,則函式pingGoogleDnsOnce失敗;如果ping成功,則函式成功
退出代碼 0 表示成功
和if構造只是檢查它后面的“命令”的退出代碼,在我們的例子中是一個函式。
還有另一種做法是人們檢查$?- 保存前一個命令的退出代碼的變數的值。在這種情況下,構造是
if [ $? -eq 0 ]; then
但這不是推薦的。和放置該命令的內if條件是一個較好的方法
為什么PING=$(ping -c 8.8.8.8)失敗
該$(...)構造稱為命令替換。它被取代的通過輸出所述的命令是內()。所以變數PING保存的輸出ping...blah blah和輸出是一個長的多行字串,它不是一個命令
uj5u.com熱心網友回復:
您的腳本嘗試將命令的輸出存盤到 PING 變數,而不是命令本身。有兩種測驗命令結果的基本方法,一種是檢查其輸出,另一種是檢查其回傳碼。
在 ping 的情況下,您可以通過檢查其回傳碼來簡單地檢查它是否成功,因此您可以執行以下操作:
if ping -qc1 8.8.8.8 -W1 >/dev/null; then
但是,如果您想存盤命令,可以通過將其引數存盤為陣列來實作:
PING=(ping -qc1 8.8.8.8 -W1)
if "${PING[@]}"; then
但是,這不允許您存盤重定向,例如>/dev/null,因此與其將其存盤為陣列,不如將其存盤為一個函式:
do_ping() {
ping -qc1 8.8.8.8 -W1 >/dev/null
}
然后你可以執行:
if do_ping; then
請注意使用與其外部命令名稱相似的函式名稱,因為這會導致回圈呼叫:
ping() {
ping -qc1 8.8.8.8 -W1 >/dev/null
}
您可以使用以下command命令來避免它:
ping() {
command ping -qc1 8.8.8.8 -W1 >/dev/null
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/405556.html
標籤:
上一篇:Lubridate:陳述句自行回傳TRUE/FALSE,但在函式中會引發“需要TRUE/FALSE的缺失值”錯誤
下一篇:FlaskHTTP方法不允許訊息
