linux 可以导入if语句吗?

hxzsmxv2  于 5个月前  发布在  Linux
关注(0)|答案(8)|浏览(38)

我有一个脚本,如果它运行,每次输出大约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作为示例,但它应该被上面提到的脚本所取代。
问题是,如何在if/elif条件下获得cat /etc/password的输出?

8iwquhpp

8iwquhpp1#

正如@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。

6fe3ivhb

6fe3ivhb2#

我建议使用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示例。

ybzsozfc

ybzsozfc3#

你只需要:

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

字符串
如果grep exit code为0,它将播放...命令。
请记住\[ is a external command,可能位于/usr/bin/[中(通常它是到test的硬链接,当作为[调用时,它需要匹配的]参数)。也请参阅pitfalls页面,其中许多交易都与该命令有关。

z9zf31ra

z9zf31ra4#

使用子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

字符串

h5qlskok

h5qlskok5#

使用&&:

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

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

字符串

kyvafyod

kyvafyod6#

下面的例子如何:

#!/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

字符串

pvcm50d1

pvcm50d17#

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

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

dgiusagp

dgiusagp8#

我有一个不带if关键字的pipe to语句的简单示例:

echo -e hello | [ $(cat) == hello ] && echo "Ok"

字符串
else太简单了:

echo -e hello | ([ $(cat) == 'bye' ] && echo "Ok" || echo "No Okey")


例如,你想检查http响应的状态码是否等于200:

curl http://google.com -w "%{http_code}" -s -o /dev/null | [ $(cat) == 200 ] && echo "Request successful processed"
# Note: in this example google response is 403 .

相关问题