我有一个简单的脚本,我试图在其中查找 make some_target 是否存在。如果不存在则打印一条语句并退出 1。
#!/bin/bash
set +ex
output=$(make -n some_target 2>&1 | head -1)
echo "$output"
if [ "$output" == "*No rule to make target*" ]; then
echo "Target is not Present"
exit 1
else
echo "foo"
fi
但它抛出一个错误并进入 else 循环
make: *** No rule to make target 'some_target'. Stop.
test.sh: 5: [: make: *** No rule to make target 'some_target'. Stop.: unexpected operato
foo
答案1
我能够在下面找到答案:
#!/bin/sh
set +ex
if make -n some_target 2>&1 | grep -m 1 "No rule to make target"; then
echo "Target is not Present"
exit 1
else
echo "foo"
fi
答案2
模式匹配(*)可以在bash
逻辑运算符 ==
、=
、 ,!=
其中右侧的操作数被视为模式。所以你可以写你的条件:
if [[ $output == *'No rule to make target'* ]]
检查答案是否包含No rule to make target
.
也就是说,检查make
?的返回码可能会更有效。
(*) 这与对文件名进行的基本模式匹配相同。还有一个=~
采用正则表达式的逻辑运算符。