linux Bash shell `if`命令返回`then`执行一些操作

vuktfyat  于 2023-05-16  发布在  Linux
关注(0)|答案(3)|浏览(168)

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

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

knpiaxh11#

很接近了,但是你需要用fi完成if
此外,if只运行一个命令,如果命令成功(退出状态码为0),则执行条件代码,而grep只有在找到至少一个匹配项时才执行条件代码。所以你不需要检查输出:

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

如果您使用的是旧版或非GNU版本的grep,并且不支持-q(“quiet”)选项,您可以通过将其输出重定向到/dev/null来实现相同的结果:

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

在这种情况下,你可以完全不使用grep,因为如果ls没有找到指定的文件名,它将返回非零值,就像D.Shawley的回答一样:

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

但在Zsh或设置了failglob选项的Bash中,如果通配符不匹配任何东西,这样的命令将出错,而无需实际运行ls。您可以利用该行为进行检查,而根本不需要ls

# Zsh, or Bash with failglob set
if (echo *log*) >&/dev/null; then
  echo "there are files of type log"
fi

也可以设置为nullglob

# with 'nullglob' set, in either Bash or Zsh
for f in *log*; do
  echo "There are files of type log"
  break
done

在Ksh或Bash中,如果没有设置任何选项,则需要更多的工作:

# Ksh or Bash without failglob or nullglob
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
7ivaypg9

7ivaypg92#

如果没有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'
4zcjmb1e

4zcjmb1e3#

if内置执行shell命令,并根据命令的返回值选择块。如果ls没有找到请求的文件,则返回一个不同的状态码,因此不需要grep部分。[[utility 实际上是bash中的一个内置命令IIRC,用于执行算术运算。我可能是错的,因为我很少偏离伯恩shell语法。
无论如何,如果你把所有这些放在一起,那么你最终会得到以下命令:

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

相关问题