如何修复'1: No such file or directory'



如何将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

从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:

将您的代码更改为:

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:内置["test"shell的-z选项检查"$grep_result"是否为空字符串;如果是,则条件计算结果为true

路线#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 .):与上面的想法类似,但请注意,我们对grep使用-rc选项,而不是-r;选项的c部分表示"不输出匹配的行,只输出找到的匹配数量的数字计数"。所以在这种情况下,你会得到一个大于或等于0的整数
  • if [ $grep_result_count -eq 0 ]; then:这里的-eq选项检查它左边的值是否等于它右边的值。在这种情况下,我们检查上一个grep命令的匹配数是否正好等于0

检查是否匹配的正确方法是

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会打印该计数。

您还可以使用更高效的东西:

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

希望这能有所帮助。

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

相关内容

  • 没有找到相关文章

最新更新