if语句语法错误

时间:2011-06-24 12:26:58

标签: linux bash shell terminal grep

if [ (`grep -R -l "${images}" *` | wc -l) == 1 ]

这不起作用。如果我在命令行执行此操作,那么它会给我一个数字。

grep -R -l "${images}" * | wc -l

我想看看那个数字是否为1.如果它是做某事。如果不做别的事。为什么第一个代码块会给我一个sytax错误?

我已更新了我的代码。 image_count与数字是正确的,但由于某种原因,即使$ image_count真的是1,它总是在做else。所以我的if语句不正确。谁知道为什么?

image_count=`grep -R -l "${images}" * | wc -l`
echo $image_count
if [ $image_count == 1 ]; then
new_name=`grep -R -l "slide[0-9]"`
echo new_name
else
echo "non 1"
fi

5 个答案:

答案 0 :(得分:1)

  

所以我的if语句不对。任何人   知道为什么吗?

嗯,这是测试语句(在[ ]内)似乎是错误的。 它混合了两种语言:bash的命令语言(命令,可执行文件连接在一起+控制流语法)。

OTOH,在上面的[]内,它是test程序的表达式语言,请参阅联机帮助页:$ man test:“(表达式)”。

表达式是一个任意的shell命令,但是从基元(字符串,数字等)和运算符(-eq,-oe)构建的东西。

这两种语言之间的一个桥接当然是反引号 - 它在其中运行bash命令并将输出替换为字符串test然后可以使用它。

所以,正如其他人简要回答的那样,只需将反推出移到左侧的边界,即从:

if [ (`grep -R -l "${images}" *` | wc -l) == 1 ]

if [ `grep -R -l "${images}" * | wc -l` = 1 ]

更新:查看您的第二个版本,另一个问题是==不是test中的有效运算符(再次参见联机帮助页)。请改用普通=

另一方面,bash本身支持==(在最近的版本中) - 有点令人困惑......

答案 1 :(得分:0)

使用:

if [ `grep -R -l "${images}" * | wc -l` == 1 ]

答案 2 :(得分:0)

foo=`grep -R -l "${images"} * | wc -l`
if [ $? -ne 0 ]; then
    if [ $foo == 1 ]; then
        echo "1 file found";
    else
        echo "$foo files found";
    fi
else 
    echo "no files found";
fi

答案 3 :(得分:0)

#!/bin/bash
if [ `grep -R -l "${images}" * | wc -l` == "1" ]; then
  echo "hazzar!"
fi

答案 4 :(得分:0)

您可以避免复杂的管道使用,并使用grep的'-c'选项输出匹配行的数量。

if [ $( grep -rlc "${images}" * ) -eq 1 ]; then

这里有多件事,使用'-c'并与数字1比较,与字符串1进行比较。 (-R和-r相当于grep手册)