如果在单行,则重击

Hor*_*dea 88 linux bash command-line bashrc

我想知道如何在一行中编写 bash 脚本中的 if 条件。

例如,我怎么能把这个写在一行上,然后把另一个和它一样的放在下一行?

if [ -f "/usr/bin/wine" ]; then
    export WINEARCH=win32
fi
Run Code Online (Sandbox Code Playgroud)

我问这个是因为我的 .bashrc 中有很多别名,而且我在多个系统上有相同的 .bashrc(同步),但我不需要每个系统上的所有别名。我把它们中的大部分放在 if 语句中,现在一切都很好,但它们占用了很多空间,每行 3 行加上它们之间的空行(我喜欢让它们很容易看到)

我也会将此技术用于环境变量。

dr_*_*dr_ 140

你会这样写:

if [ -f "/usr/bin/wine" ]; then export WINEARCH=win32; fi
Run Code Online (Sandbox Code Playgroud)

请注意,这也可以写成(如@glennjackman 所建议的那样):

[ -f "/usr/bin/wine" ] && export WINEARCH=win32
Run Code Online (Sandbox Code Playgroud)

  • 有一个区别。1. 表达式将以 0 状态退出,2. 如果文件不存在,则表达式将以非 0 状态退出。如果您在某些自动化任务中使用它,例如部署,其中任务成功取决于命令的退出状态,这可能会有所不同。 (16认同)
  • @HoraşiuMlendea 显然这很容易。如果你知道怎么做的话。但语法很繁琐,例如 [1==1] 是一个错误,但 [1==1] 有效。还有分号。你怎么会因为不了解一些设计糟糕的复杂语法而感到尴尬呢?你的“感觉”根本没有意义。这是一个有用的问题,即使不幸的是你不明白为什么。 (3认同)
  • @balop 不,我完全明白你的意思,我同意。只是当时我理解了构成该语法的各个部分(带有 && 的部分)。通常把东西放在一起很容易和直观,但正如你所说,这种语言非常繁琐而且不是很直观。 (2认同)

小智 5

我还发现只需输入任何复杂的 if then else 命令,按 Enter,然后在执行后按向上箭头。命令行当然会重复最后输入的命令,但在这种情况下,它会根据您的需要将其全部放在一行中。这是一种作弊方式,但很有效。

  • 请注意,这可能取决于您的 shell(并且可能进一步取决于您的 shell 设置)。在我的计算机上进行的一些快速测试表明这在 Bash 中有效(所以有一个 +1),但是 Zsh 在返回到以前的命令时保留了换行符。 (6认同)

小智 5

要在一行上测试和处理 true 和 false 条件,您可以执行以下操作:

[ -f "/usr/bin/wine" ] && export WINEARCH=win32 || echo "No file"
Run Code Online (Sandbox Code Playgroud)

您还可以包含退出代码:

[ -f "/usr/bin/wine" ] && export WINEARCH=win32 || exit 1
Run Code Online (Sandbox Code Playgroud)

但是,请避免在 or 运算符后面包含多个命令,因为它始终会被执行:

# This will always return an exit status of 1 even if the first condition is true
[ -f "/usr/bin/wine" ] && export WINEARCH=win32 || echo "No file" && exit 1
Run Code Online (Sandbox Code Playgroud)