J. *_*ker 4 shell control-flow
我试图在一个条件之后执行多个命令,例如......
[ $VAR ] || echo "Error msg" ; echo "exit"
Run Code Online (Sandbox Code Playgroud)
和逆
[ -z $VAR ] && echo "Error msg" ; echo "exit"
Run Code Online (Sandbox Code Playgroud)
我知道这不会按预期工作,实际上我以前知道如何执行但忘记了如何执行此操作。我完全了解许多替代方案,例如使用if
's 或通过()
和括起来{}
。使用()
将创建一个不会退出正在运行的脚本的子进程。使用{}
会起作用,但我知道存在一个更具可读性的替代方案。
我用 做了这个:
,它是完美的!!!我现在一辈子都记不起来了,而且我丢失了以前写过的剧本。
如果有人知道如何用:
's写这个,我真的很感激任何帮助!
我倾向于使用这样的东西,我认为它很好读:
[ -z $VAR ] && {
echo "Error msg"
exit ${LINENO}
} >&2
Run Code Online (Sandbox Code Playgroud)
对于:
,我唯一能想象的是您以某种方式定义了一个函数,但我不知道如何将其转换为允许执行多个命令的块。
来自man bash
:
: [arguments]
No effect; the command does nothing beyond expanding arguments and
performing any specified redirections. A zero exit code is returned.
Run Code Online (Sandbox Code Playgroud)
所以我看到的唯一可能性是你是否重新定义:
为其他东西。我将有兴趣看到可能是什么的任何可能性。
更具可读性的替代方案是
if [ "$VAR" ]; then
echo "Error msg" 1>&2
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
我知道这不是你要找的。但这是你应该写的。使用&&
and ||
here 有点神秘。我不知道你记住了什么(或记错了),但不管它是什么,如果这里没有人甚至能猜到它是什么,它肯定不是有资格被称为“可读”的东西。
顺便说一下,注意周围的引号$VAR
。始终在变量替换周围放置双引号,除非您知道为什么需要省略引号以及为什么这样做是安全的。(你不需要在里面加引号[[ … ]]
,但你肯定需要在里面[ … ]
)。
eval
是一种对命令进行分组的偷偷摸摸的方式,但使用它并不符合可读性。
在另一个命令中产生输出的另一种方法是在命令替换中进行。同样,这不符合可读性。
[ "$VAR" ] && exit 1$(echo "error message" >&2)
Run Code Online (Sandbox Code Playgroud)
如果没有某种形式的分组构造(无论是大括号还是其他复合形式,如if
/ then
/fi
或while
/ do
/ done
),您就不能在主 shell 进程中执行多个命令;除了一个之外的所有内容都将在一个子shell中。