如何修复'1:没有这样的文件或目录'

时间:2012-11-21 19:07:59

标签: bash

如何将bash shell脚本中的变量与小于1?

进行比较

我之前做过,但我得到'1:没有这样的文件或目录'

grep_result=`grep -r $ID . | wc -l`

echo $grep_result
# it said '1: No such file or directory'
if [ $grep_result < 1 ]; then
    echo "Wrong id.
    exit 1
fi

4 个答案:

答案 0 :(得分:3)

从bash的角度来看,这意味着将名为1的文件传输到$ grep_result变量中。在这种情况下,您需要使用-lt运算符。 (le代表少于)

grep_result=`grep -r $ID . | wc -l`

echo $grep_result
# it said '1: No such file or directory'
if [ $grep_result -lt 1 ]; then
    echo "Wrong id.
    exit 1
fi

答案 1 :(得分:1)

以下是更改代码的两种不同方法:

路线#1:

将您的代码更改为:

grep_result=$(grep -r $ID .)

echo $grep_result

if [ -z "$grep_result" ]; then
    echo "Wrong id."
    exit 1
fi

<强>解释

  • grep_result=$(grep -r $ID .):在子shell中运行grep -r $ID .并将结果输出保存到stdoutgrep_result$(...)表示法称为命令替换,优于使用反引号以提高可读性+允许嵌套命令
  • if [ -z "$grep_result" ]; then-z“test”shell内置的[选项检查"$grep_result"是否为空字符串;如果是,则条件评估为真。

路线2:

或者,或者:

grep_result_count=$(grep -rc $ID .)

echo $grep_result_count

if [ $grep_result_count -eq 0 ]; then
    echo "Wrong id."
    exit 1
fi

说明:

  • grep_result_count=$(grep -rc $ID .):与上述类似的想法,但请注意我们使用-rc的{​​{1}}选项代替grep;选项的-r部分意味着“不输出匹配的行,只输出找到多少匹配的数字计数”。所以在这种情况下,你会得到一个大于或等于0的整数。
  • c:此处的if [ $grep_result_count -eq 0 ]; then选项会检查左侧的值是否等于右侧的值。在这种情况下,我们检查前一个grep命令的匹配数是否完全等于0.

答案 2 :(得分:1)

检查没有匹配的正确方法是

if ! grep -q -r "$ID" . ; then
    echo Wrong id.
    exit 1
fi

这是正确的:如果if是运行命令并检查其退出代码的目的。如果匹配则grep返回成功退出代码,否则返回1(错误)。为了这个目的,大多数Unix工具都是这样编写的。

在有匹配时获取计数是一个小修改:

if matches=$(grep -r "$ID" .) ; then
    echo "$matches" | wc -l
else
    echo Wrong Id.
    exit 1
fi

请注意使用grep -q只返回错误代码而不打印任何内容。如果您只想要从单个文件中计数(或每个文件的匹配数)grep -c打印出来。

答案 3 :(得分:0)

您还可以使用更高效的内容:

if ! grep -qr "$ID" . ; then
    echo "Wrong id."
    exit 1
fi

希望这有帮助。

使用-q选项,grep只是保持安静,一旦找到模式就停止(如果可以找到它),并输出true返回值,如果模式是找到了,false否则。这可能是解决问题的最有效方法。