将这两个IF语句合并为一个?

时间:2016-10-02 23:57:00

标签: 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

3 个答案:

答案 0 :(得分:1)

在两者之间添加||短路评估:

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 :(得分:1)

[[ -n $(system_profiler SPPrintersDataType | grep Shared | grep Yes)$(system_profiler SPPrintersDataType | grep 'System Printer Sharing: Yes') ]] && echo 1

注意:

  • 如果其中一个字符串非空或者另一个字符串非空,则希望回显1。在这种情况下,链接字符串并查看结果更简单:如果结果非空,则至少有一个输入字符串必须为非空。

  • 在这种情况下,不需要使用if语句(虽然不禁止)。

  • 如果您使用-s来测试字符串,则不需要将参数引用到[[ ... ]]

  • 当你grep 共享时,是否允许这个词出现之前 Shared < / em>在线?如果没有,写grep 'Shared.*Yes会更简单。

  • 由于您对 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_profiler中有一行包含共享...是或包含系统打印机共享的行是,则回显1 。您需要使用-E in才能使|以正则表达式模式工作。

不可否认,所有这些建议意味着只有一个1被回复,如果条件已满足,而在原始解决方案中,如果两者,则会得到两个1被回复条件得到满足。因此,我的解决方案与您的完全相同。但是,既然您明确表示要合并案例,我认为这是可以接受的。

答案 2 :(得分:0)

我不知道system_profiler的输出效果如何,所以在这里猜测一下。如果SharedYes在一行中的顺序相同,则可以与

一起使用grep
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 - 我猜这是你想要的,但我提到它,因为它与你的脚本不同。