Bash 将这两个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语句合并为一个的方法

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
    
这基本上是说:如果system|u profiler中有一行包含Shared…Yes或一行包含system Printer Shared Yes,则echo 1。您需要-E in以使
在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