危險外殼的條件評論

危險外殼的條件評論

這就是我想要實現的目標。

#!/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

這只是您已經所做的事情的一個相當簡寫的表示法:如果不是,[[ ... ]]則測試將產生,因此命令列表的執行將在.falsesafemodeoff&&

可能值得注意的是,在&&鍊式命令列表的情況下,退出代碼將是最後執行的命令的退出代碼,因此如果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一樣簡單。onoff


我們可以也許可以擴展它(儘管我不一定認為我們應該)以使危險命令成為 的參數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?"

相關內容