任何方式将这两个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
答案 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
的输出效果如何,所以在这里猜测一下。如果Shared
和Yes
在一行中的顺序相同,则可以与
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
- 我猜这是你想要的,但我提到它,因为它与你的脚本不同。