我寫了一個for回圈來獲取尚未安裝的工具的數量。這是我的代碼:
#!/bin/bash
DIALOG_INSTALLED=$(which dialog)
BREW_INSTALLED=$(which brew)
TELNET_INSTALLED=$(which telnet)
UNINSTALLED_TOOLS=0
for installed_for in $DIALOG_INSTALLED $BREW_INSTALLED $TELNET_INSTALLED; do
if [[ -z $installed_for ]]; then
let "$UNINSTALLED_TOOLS =1"
fi
done
echo $UNINSTALLED_TOOLS
我的問題是,當我去運行代碼時,$UNINSTALLED_TOOLS仍然等于0。要找到問題的根源,回圈$UNINSTALLED_TOOLS=3之前和之后。for這兩個調整都將最終值更改$UNINSTALLED_TOOLS為 3。現在我知道問題出在for回圈中。就好像代碼正在跳過for回圈。我沒有收到任何語法錯誤,所以我很困惑。
任何幫助表示贊賞。
uj5u.com熱心網友回復:
假設dialog沒有找到。變數替換后,你得到:
for installed_for in /usr/local/bin/brew /usr/local/bin/telnet; do
所以$installed_for永遠沒有機會成為一個空字串。一旦你for用空字串回圈,你let也是不正確的,因為在替換之后你有
let 0 =1
這沒有任何意義。所以:
DIALOG_INSTALLED=$(which dialog)
BREW_INSTALLED=$(which brew)
TELNET_INSTALLED=$(which telnet)
INSTALLED_ARRAY=("$DIALOG_INSTALLED" "$BREW_INSTALLED" "$TELNET_INSTALLED")
UNINSTALLED_TOOLS=0
for installed_for in "${INSTALLED_ARRAY[@]}"; do
if [[ -z $installed_for ]]; then
let UNINSTALLED_TOOLS =1
fi
done
echo "$UNINSTALLED_TOOLS"
uj5u.com熱心網友回復:
for installed_for in $DIALOG_INSTALLED $BREW_INSTALLED $TELNET_INSTALLED; do
這不是超過 3 個元素的回圈;這是一個回圈,無論變數$DIALOG_INSTALLED $BREW_INSTALLED $TELNET_INSTALLED擴展到多少單詞。因此,例如,如果您有/usr/bin/dialog, /bin/telnet, 但brew已卸載,那么for將是 2 個元素的回圈,就像您鍵入
for installed_for in /usr/bin/dialog /bin/telnet; do
特別是[[ -z $installed_for ]]永遠不會是真的。
您可能想參考它們,以便如果它們中的任何一個為空,for回圈仍將其作為空字串進行迭代:
for installed_for in "$DIALOG_INSTALLED" "$BREW_INSTALLED" "$TELNET_INSTALLED"; do
還有,let "$UNINSTALLED_TOOLS =1"錯了。它在評估算術之前擴展$UNINSTALLED_TOOLS,所以它變成了let 0 =1無效的東西。它應該是let "UNINSTALLED_TOOLS =1".
uj5u.com熱心網友回復:
如果您只想計算已卸載的工具,您可以執行以下操作
w() { which -s "$1"; echo $?; }
uninstalled_tools=$(( $(w dialog) $(w brew) $(w telnet) ))
不需要回圈。只需讓函式回顯值和總和。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/493678.html
下一篇:C語言中的模式問題
