
這就是我想要實現的目標。
#!/bin/bash
safemode=on
if [ $safemode == 'off' ];then
run dangerous code
fi
我有129條危險線,全部都是分開的。最好的方法是什麼?
答案1
「最佳方法」很大程度上取決於您認為最大的努力程度。一種相當簡單的方法是使用&&
-connected 命令清單對範例進行輕微修改。您可以使用 Bash 的算術測試結構:
#!/bin/bash
safemode=1
(( ! safemode )) && run dangerous code 1
uncritical code
(( ! safemode )) && run dangerous code 2
或普通的基於字串的運算符
#!/bin/bash
safemode=on
[[ $safemode = "off" ]] && run dangerous code 1
uncritical code
[[ $safemode = "off" ]] && run dangerous code 2
這只是您已經所做的事情的一個相當簡寫的表示法:如果不是,[[ ... ]]
則測試將產生,因此命令列表的執行將在.false
safemode
off
&&
可能值得注意的是,在&&
鍊式命令列表的情況下,退出代碼將是最後執行的命令的退出代碼,因此如果safemode
設置,則將$?
在1
此類“受保護”行之後(以防萬一您使用退出代碼以這種方式)。
答案2
如果我們將變數定義safemode
為兩個命令true
或之一false
,那麼我們可以使用它作為前綴:
#!/bin/sh
safemode=true
safe_mode_off() { safemode=false }
"$safemode" || run dangerous code 1
uncritical code
"$safemode" || run dangerous code 2
我想我們通常會從選項處理中設定變量,因此true
/和/false
一樣簡單。on
off
我們可以也許可以擴展它(儘管我不一定認為我們應該)以使危險命令成為 的參數false
,如下所示:
#!/bin/sh
risky=false
safe_mode_off() { risky= }
$risky run dangerous code 1
uncritical code
$risky run dangerous code 2
然而在這種情況下,擴展仍然會在參數中發生 - 例如$(dangerous subcommand)
仍然會被執行,所以我們需要將其更改為$($risky dangerous subcommand)
.我認為這對於認真使用來說太容易出錯。
答案3
如果您想要簡寫,可以使用別名。它們比任何常規擴展更像文字替換,因此語法結構能透過它們插入。只需要在 Bash 腳本中明確啟用,並且您要確保不會意外啟用不需要的別名。
#!/bin/bash
unalias -a
shopt -s expand_aliases
# default safe
alias risky='[ "$riskymode" = enabled ] &&'
riskymode=
if [ "$1" = risky ]; then
riskymode=enabled
fi
echo this is normal
risky echo this is risky
但請注意,仍然需要注意的是,條件仍然只是&&
清單的一部分,因此:
risky echo try something risky || echo oopsie it failed
echo oopsie
即使禁用了riskymode,也會運行。
但你可以這樣做:
risky ( echo try something risky || echo oopsie it failed )
甚至
risky if ! echo another risky attempt; then echo another failure; fi
(您可以將複合指令放入&&
-list 中)
我們甚至可以讓別名將該行作為註解:
#!/bin/bash
unalias -a
shopt -s expand_aliases
alias risky='#'
if [ "$1" = risky ]; then
alias risky=''
fi
risky echo something risky, again || echo "does it fail now?"
但當然它會忽略第一個線,因此這將再次以“安全”模式運行第二行:
risky echo something even more risky ||
echo "_now_ does it fail?"