在单行上执行Bash的if语句

我想知道如何在一个单行的bash脚本中编写if条件。 例如,我该如何将这个条件写在一行,并在下一行再写一个类似的条件?
if [ -f "/usr/bin/wine" ]; then
    export WINEARCH=win32
fi
我问这个问题是因为我在我的.bashrc中有很多别名,并且我在多个系统上使用相同的.bashrc(同步),但我不需要每个系统上的所有别名。 我将大部分别名放在if语句中,现在一切都很好,但它们占用了很多空间,每个别名需要3行加上它们之间的空白行(我喜欢让它们容易看到)。 我也会将此技术用于环境变量。

5您也可以写 [ -f "/usr/bin/wine" ] && export WINEARCH=win32 - glenn jackman
7记住,短并不一定就是更好的。使用shell的逻辑运算符可能会导致微妙的逻辑错误。选择易于阅读和维护的方式。 - glenn jackman
完全同意选择更容易阅读的方式(删除像“如果”和“那么”这样的线索词可能会导致灾难)。在一行上有一个单一条件几乎总是比分散在三行上更容易阅读和维护。 - JonathanDavidArndt
4个回答

你会这样写:

你会这样写:

if [ -f "/usr/bin/wine" ]; then export WINEARCH=win32; fi
请注意,这也可以按照@glennjackman的建议进行写作:
[ -f "/usr/bin/wine" ] && export WINEARCH=win32

1嗯,那真是太容易了... :) 现在我有点尴尬问了。不过还是谢谢你的回答,帮了我很多! - Horațiu Mlendea
25有一个区别。1. 表达式将以0状态退出,2. 如果文件不存在,则表达式将以非0状态退出。如果您在某些自动化任务(如部署)中使用此命令并且任务成功取决于命令的退出状态,则这可能会产生差异。 - Jānis Gruzis
2@HorațiuMlendea 显然这很简单,只要你知道怎么做。但是语法有点繁琐,例如 [1==1] 是错误的,但是 [ 1==1 ] 可行。还有分号的问题。你怎么会因为不知道一些琐碎且设计不良的语法而感到尴尬呢?你的"感觉"完全没有任何意义。即使不幸的是,你不明白其中的原因,这个问题仍然是有用的。 - barlop
2@balop 不,我完全明白你的意思,而且我同意。只是当时我理解了组成那个语法(带有&&的那个)的各个部分。通常情况下,把事物结合起来很容易且直观,但正如你所说,这种语言相当琐碎,不太直观。 - Horațiu Mlendea

我还发现只需输入任何复杂的if then else命令,按下回车键,然后在执行完毕后按上箭头。当然,命令行会重复上次输入的命令,但在这种情况下,它会将其放在一行上,正如您所要求的那样。这是一种取巧的方法,但非常有效。

6请注意,这可能取决于您的shell(可能还取决于shell的设置)。在我的电脑上进行了一些快速测试,发现在Bash中可以正常工作(所以加1),但是当返回到之前的命令时,Zsh会保留换行符。 - 8bittree

为了在一行中测试和处理真假条件,您可以这样做:
[ -f "/usr/bin/wine" ] && export WINEARCH=win32 || echo "No file"
你还可以包含一个退出代码:
[ -f "/usr/bin/wine" ] && export WINEARCH=win32 || exit 1
然而,避免在或运算符之后包含多个命令,因为它们总是会被执行:
# 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

如果你需要更复杂一点的操作,你也可以使用()来分组语句并详细说明操作: 在这种情况下,如果之前不存在文件/usr/bin/wine,则不会创建该文件,而不使用()则会创建它。

  • 相关问题