Bash 如果在一行上

Bash 如果在一行上

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

例如,我怎样才能在一行上写这个,然后在下一行上放另一个类似的?

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

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

我也将使用这种技术来处理环境变量。

答案1

你可以这样写:

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

请注意,也可以这样写(按照@glennjackman 的建议):

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

答案2

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

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

答案3

我还发现,只要输入任何复杂的 if then else 命令,按回车键,然后在执行后按向上箭头即可。命令行当然会重复最后输入的命令,但在这种情况下,它会按照您的要求将所有内容放在一行上。这是一种作弊方法,但很有效。

答案4

如果您需要更多一点的复杂性,您还可以使用()分组语句并详细说明操作:

[ -f "/usr/bin/wine" ] && (grep -Exiq /usr/bin/wine || echo "Foo" >> /usr/bin/wine)

在这种情况下,如果文件 /usr/bin/wine 先前不存在,它将不会创建它,而不使用()则会创建它。

相关内容