这就是我想要实现的目标。
#!/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?"