对危险外壳的条件评论

对危险外壳的条件评论

这就是我想要实现的目标。

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

相关内容