![Bash 如果在一行上](https://linux22.com/image/1519317/Bash%20%E5%A6%82%E6%9E%9C%E5%9C%A8%E4%B8%80%E8%A1%8C%E4%B8%8A.png)
我想知道如何在 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 先前不存在,它将不会创建它,而不使用()
则会创建它。