当我执行这样的命令时:
~/foo/bar | grep <someID>
输出采用以下格式:
"<someID>": "ENABLED",
状态&#34; ENABLED&#34;也可以是不同的东西,但我想检查我的ID是否已启用
我试过这个:
output= ~/foo/bar | grep <someID>
echo $output
if [[ $output =~ .*ENABLED.* ]]; then // Method 1
echo "is enabled"
else
echo "not enabled"
fi
case "$output" in // Method 2
*ENABLED*)
echo "is enabled"
;;
esac
但我总是觉得它没有启用。
基本上我想做的是检查grep的返回是否包含单词&#34; ENABLED&#34;。
有什么想法吗?
答案 0 :(得分:0)
直截了当地说:
some_id=2 # for example
if ~/foo/bar | grep -q "$some_id"'": *"ENABLED"' ; then
echo "is enabled"
else
echo "not enabled"
fi
答案 1 :(得分:0)
你需要在第一行代码中添加反引号。如果你不这样做,那么这可能是你的错误,因为$output
未定义,因此是空字符串。
output=`~/foo/bar | grep <someID>`
答案 2 :(得分:0)
如果您只是将适当的数据输入变量,那么检查$output
内容的策略都会有效。有多种方法可以将命令输出到变量中。以下都是功能相同的。
output=`~/bin/foo | grep "\"<someID>\""` # deprecated -- use $(...) instead
output="$(~/bin/foo | grep "\"<someID>\"")" # may result in multiple lines of output
read -r output < <(~/bin/foo | grep "\"<someID>\"") # uses "Process Substitution"
其中前两个适用于任何旧的POSIX shell。第一个甚至可以在csh / tcsh中使用。使用Process Substitution的最后一个是bash-only(或者至少不是POSIX)。
但正如你在其他答案中看到的那样,你可能不需要变量。您可以使用正则表达式来匹配您感兴趣的整行:
if ~/foo/bar | grep -q "\"$someID\""'": *"ENABLED"'; then
echo "enabled"
else
echo "disabled"
fi
如果$someID
可能会在您的输出中出现多次,并且值不同,则此构造会更安全。
如果您使用案例陈述,那么您希望确保在$someID
多次出现时知道该怎么做。
while read -r output; do
case "$output" in
*ENABLED*) echo "enabled" ;;
*DISABLED) echo "disabled" ;;
*) echo "ERROR: Unknown state." >&2 ;;
esac
done < <(~/foo/bar | grep "\"$someID\"")
答案 3 :(得分:0)
尝试这样的事情:
some_command > /tmp/some_file.tmp
if grep -q "Some_Text" "/tmp/some_file.tmp";
then
echo "These are not the stormtroopers you are looking for."
else
echo "Stay gold, ponyboy."
fi
# Removing the tmp file is optional, but I'm OCD, so...
rm /tmp/some_file.tmp
此命令将在开箱即用的Ubuntu系统或具有BASH终端的任何* nix系统上正常工作。您可以根据自己的使用情况进行调整。