Shell 条件后的多个命令列表、&&、||。Shell 脚本,破折号

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写这个,我真的很感激任何帮助!

nic*_*bot 5

我倾向于使用这样的东西,我认为它很好读:

[ -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)

所以我看到的唯一可能性是你是否重新定义:为其他东西。我将有兴趣看到可能是什么的任何可能性。

  • @TechZilla 我对它可能是什么很感兴趣,但是,IMO,使用聪明的“非显而易见”代码不是一个好主意。在不引入不常见语法的情况下,脚本编写已经足够迟钝了。此外,除了作为一个有趣的练习或炫耀之外,这种技术的唯一用途似乎是混淆,无论它在您看来多么“优雅和简洁”。如果你不记得怎么做,你也可能会忘记它的意思,所以即使你只为自己编写脚本,你也一定会通过尝试变得聪明而让你的生活变得更加复杂。只是我的 2 美分 (2认同)

Gil*_*il' 5

更具可读性的替代方案是

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/fiwhile/ do/ done),您就不能在主 shell 进程中执行多个命令;除了一个之外的所有内容都将在一个子shell中。