Bash shell`if`命令返回`then`做某事

时间:2012-04-29 13:52:52

标签: linux bash if-statement

我正在尝试执行if / then语句,如果ls | grep something命令有非空输出,那么我想执行一些语句。我不知道我应该使用的语法。我尝试了几种变体:

if [[ `ls | grep log ` ]]; then echo "there are files of type log";

3 个答案:

答案 0 :(得分:22)

嗯,即将结束,但您需要使用if完成fi

此外,if只运行命令并在命令成功时执行条件代码(以状态代码0退出),grep仅在找到至少一个匹配时才执行。所以你不需要检查输出:

if ls | grep -q log; then echo "there are files of type log"; fi

如果您使用的旧版本或非GNU版本的grep不支持-q(“安静”)选项,则可以通过重定向来获得相同的结果它的输出为/dev/null

if ls | grep log >/dev/null; then echo "there are files of type log"; fi

但是如果ls找不到指定的文件也会返回非零值,你可以在没有grep的情况下做同样的事情,就像在D.Shawley的回答中那样:

if ls *log* >&/dev/null; then echo "there are files of type log"; fi

你也可以只使用shell,甚至没有ls,尽管它有点啰嗦:

for f in *log*; do 
  # even if there are no matching files, the body of this loop will run once
  # with $f set to the literal string "*log*", so make sure there's really
  # a file there:
  if [ -e "$f" ]; then 
    echo "there are files of type log"
    break
  fi
done 

只要您专门使用bash,就可以设置nullglob选项以简化这一点:

shopt -s nullglob
for f in *log*; do
  echo "There are files of type log"
  break
done

答案 1 :(得分:3)

或没有if; then; fi

ls | grep -q log && echo 'there are files of type log'

甚至:

ls *log* &>/dev/null && echo 'there are files of type log'

答案 2 :(得分:1)

if内置执行shell命令,并根据命令的返回值选择块。 ls如果找不到请求的文件,则会返回不同的状态代码,因此不需要grep部分。 [[ 实用程序实际上是来自bash IIRC的内置命令,它执行算术运算。我可能错了,因为我很少偏离Bourne shell语法。

无论如何,如果你将所有这些放在一起,那么你最终会得到以下命令:

if ls *log* > /dev/null 2>&1
then
    echo "there are files of type log"
fi