可以输入if语句吗?

时间:2012-02-24 10:23:06

标签: linux bash

我有一个脚本,如果它运行,每次输出大约10行。这些行的内容各不相同。

我真的希望能够在输出中grep并根据输出做不同的事情。

在伪这是我想做的事情

cat /etc/password | \\
if [ grep "root" $STDOUT ]; then
   echo "root is found"

elif [ grep "nobody" $STDOUT ]; then
   echo "nobody is found"

fi

我在这里以cat /etc/password为例,但应该用我上面提到的脚本替换它。

问题是,如何在cat /etc/password / if条件下获取elif的输出?

7 个答案:

答案 0 :(得分:7)

正如@Benoit建议的那样,只需直接使用grep

正如@larsmans所说,你可以通过将文件读入变量一次来避免双重读取文件。

鉴于bash的可用性,我会这样做:

password=$(< /etc/passwd)

if grep -q root <<< "$password" ; then
    echo root found
elif grep -q nobody <<< "$password" ; then
    echo nobody found
fi

一次读取文件,一次或两次调用grep,没有启动其他进程或子shell。

答案 1 :(得分:3)

你这样做:

if grep -q "root" /etc/passwd ; then
   ...
fi

如果grep退出代码为0,将播放...命令。

请记住\[ is a external command,可能位于/usr/bin/[(通常是test的硬链接,当调用[时,它需要匹配的]参数)。另请参阅此处的pitfalls页面,其中许多内容与该命令相关。

答案 2 :(得分:3)

我建议使用awk:

cat /etc/passwd | awk '/root/{ do something }/nobody/{ do something else }'

你可以使用像这样的表达式在bash中实现相同的目标:

cat /etc/passwd |
while read; do
  if echo "$REPLY" | fgrep root; then
    something
  fi
  if echo "$REPLY" | fgrep nobody; then
    something_else
  fi
done

然而,纯粹的bash解决方案对大型输入的效率较低,因为它为每一行运行单独的grep实例。

答案 3 :(得分:2)

使用子shell可以使用if语句,但是由于您在管道上运行了两个grep命令,该解决方案将会中断,第一个命令会耗尽它。

您的案例中最好的解决方案可能是将/etc/passwd读入变量,然后grep

passwd=$(cat /etc/passwd)
if (echo $passwd | grep -q root); then
     echo "root found"
fi
if (echo $passwd | grep -q nobody); then
     echo "nobody found"
fi

答案 4 :(得分:1)

只需使用&amp;&amp;:

grep -q root /etc/password && echo "root is found"

grep -q nobody /etc/password && echo "nobody is found"

答案 5 :(得分:1)

以下内容如何:

#!/bin/bash

if [ -z $1 ]; then
   echo Usage: $0 [UID to search for]
   exit 1;
fi

SEARCHID="$1"

function notFound() {
    echo NOT FOUND 
}

function found() {
    echo Found it
}

function main() {

    grep -i $SEARCHID /etc/passwd
    # Move $? to a variable 
    SEARCHRESULT=$?

    if [ "$SEARCHRESULT" != "0" ]; then
       notFound;
    else
       found;
    fi
}

# call main function
main

答案 6 :(得分:0)

在一般情况下,您可以使用临时文件。

t=$(mktemp -t passwd.XXXXXXXX)
trap 'rm $t' 0
trap 'exit 127' 1 2 3 5 15
cat >$t
for u in root nobody; do
  fgrep $u $t
done

trap之后将删除临时文件。

顺便说一下,你可以管道到if,但条件中的第一个grep已经消耗了它的所有标准输入。在这种情况下它更有用:

if $option_count ; then
    wc -l
else
    tac
fi <file