如果单行,则重击


51

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

例如,如何将其写在一行上,然后再将另一行写在下一行上?

if [ -f "/usr/bin/wine" ]; then
    export WINEARCH=win32
fi

我之所以这样问,是因为我的.bashrc中有很多别名,并且在多个系统上具有相同的.bashrc(已同步),但是我不需要每个系统上的所有别名。我将它们中的大多数放入了if语句中,并且现在都可以很好地工作了,但是它们占用了很多空间,每行3行以及它们之间的空白行(我喜欢让它们容易可见)

我还将把这种技术用于环境变量。


4
您也可以写[ -f "/usr/bin/wine" ] && export WINEARCH=win32
glenn jackman

3
请记住,较短不一定意味着更好。您可以使用Shell的逻辑运算符获得微妙的逻辑错误。选择更易于阅读和维护的内容。
glenn jackman

Answers:


84

您可以这样写:

if [ -f "/usr/bin/wine" ]; then export WINEARCH=win32; fi

请注意,这也可以编写(如@glennjackman所建议):

[ -f "/usr/bin/wine" ] && export WINEARCH=win32

1
好吧,这很容易... :)现在,我觉得有点尴尬。谢谢您的回答,对您有很大帮助!
Horațiu Mlendea

7
有一个区别。1.表达式将以0状态退出,2.如果文件不存在,表达式将以非0状态退出。如果您在某些自动化任务(例如部署)中使用此命令,则可能会有所不同,其中任务的成功取决于命令的退出状态。
贾尼斯·格鲁吉斯

@ HorațiuMlendea显然很容易。如果你知道怎么做。但是语法很奇怪,例如[1 == 1]是一个错误,但是[1 == 1]有效。还有分号。如果不了解一些设计错误的语法,您会感到尴尬。您的“感觉”完全没有意义。这是一个有用的问题,即使不幸的是您不明白为什么。
barlop

@balop不,我完全明白你的意思,我同意。只是当时我了解组成该语法的各个位(带有&&的位)。通常,将所有内容组合在一起很容易且直观,但是正如您所说的那样,这种语言很笨拙,不是很直观。
Horațiu Mlendea,

4

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


5
请注意,这可能取决于您的外壳程序(可能还取决于您的外壳程序设置)。在我的计算机上进行的一些快速测试表明,它可以在Bash中运行(因此需要+1),但是Zsh保留返回前一个命令时的换行符。
8bittree
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.