Bash 将这两个IF语句合并为一个?
任何将这两个IF语句合并为一个的方法Bash 将这两个IF语句合并为一个?,bash,shell,logic,Bash,Shell,Logic,任何将这两个IF语句合并为一个的方法 if [ -n "$(system_profiler SPPrintersDataType | grep Shared | grep Yes)" ]; then echo 1 fi if [ -n "$(system_profiler SPPrintersDataType | grep 'System Printer Sharing: Yes')" ]; then echo 1 fi 在以下两者之间添加短路评估: if [ -n ...
if [ -n "$(system_profiler SPPrintersDataType | grep Shared | grep Yes)" ]; then
echo 1
fi
if [ -n "$(system_profiler SPPrintersDataType | grep 'System Printer Sharing: Yes')" ]; then
echo 1
fi
在以下两者之间添加短路评估:
if [ -n ... ] || [ -n ... ]; then ## Something; fi
|
被视为逻辑OR(而&&
被视为逻辑and)
就你而言:
if [ -n "$(system_profiler SPPrintersDataType | grep Shared | grep Yes)" ] || [ -n "$(system_profiler SPPrintersDataType | grep 'System Printer Sharing: Yes')" ]; then
echo 1
fi
需要注意的是,如果使用bash关键字
[[
,则以下内容也有效:
if [[ -n ... || -n ... ]]; then ## Something; fi
注:
- 如果其中一个字符串为非空或另一个字符串为非空,则要回显1。在这种情况下,更简单的方法是关联字符串并查看结果:如果结果为非空,则至少一个输入字符串必须为非空
- 在这种情况下,不需要使用
语句(尽管不禁止)if
- 如果使用
测试字符串,则不需要将参数引用到[…]
-s
- 当您grep for Shared时,是否允许单词Yes出现在行中Shared的前面
- 因为您对grep命令的实际输出不感兴趣,而只对它匹配的事实感兴趣,所以类似的方法也可以:
{system_profiler SPPrintersDataType|grep -q 'Shared.*Yes} || {system_profiler SPPrintersDataType|grep -Fq 'System Printer Sharing: Yes'} && echo 1
- 最后,假设system_profiler命令在两次调用中产生相同的输出,代码可以简化为:
{system_profiler SPPrintersDataType|grep -Eq 'Shared.*Yes|System Printer Sharing: Yes'} && echo 1
在regexp模式中工作
诚然,所有这些建议都意味着,如果满足条件,您只能得到一个
1
,而在您的原始解决方案中,如果两个条件都满足,您会得到两个1
。因此,我的解决方案并不完全等同于您的解决方案。但是,既然您明确表示要梳理在这种情况下,我认为这是可以接受的。我不知道您的系统分析器的输出是什么样子的,所以这里有点猜测。如果共享的和是的在一行中总是以相同的顺序排列,您可以与
grep 'Shared.*Yes'
你可以在一次通过时用grep搜索两个表达式
grep 'Shared.*Yes\|System Printer Sharing: Yes'
然后,您可以将命令编写为
system_profiler SPPrintersDataType \
| grep -q 'Shared.*Yes\|System Printer Sharing: Yes' \
&& echo 1
请注意,我们使用grep-q
来抑制输出,因为我们只对返回代码感兴趣
另外请注意,如果两个字符串都存在,我们只输出一个1
-我猜这是您想要的,但我提到它是因为它与您的脚本不同。这取决于您想要的结果。如果两个条件都为真,则输出1?任一条件?为每个为真的条件输出单独的1?好的,解释添加了anations。此解决方案不正确,因为只有当两个字符串都存在时,您的条件才会触发,而原始过帐中的代码,如果至少有一个字符串存在时才会触发。@user1934428 Seconded.Edited。
system_profiler SPPrintersDataType \
| grep -q 'Shared.*Yes\|System Printer Sharing: Yes' \
&& echo 1