将字符串转换为整数并比较大小的Bash命令

5
我想要一个Bash脚本,检查一个文件是否有超过#行,但我还没有成功运行它,也不太确定该怎么做。我以前从未使用过Bash。

现在我使用:linesStr=$(cat log | wc -l)来获取文件中的行数(期望得到一个字符串)。当echo时,它给出了正确的数字30。

但由于它很可能是一个字符串,所以它不能执行if语句,因此我需要将linesStr转换为一个名为linesInt的整数。

我还觉得if语句本身也不正确。

#!/bin/bash

linesStr=$(cat log | wc -l)
echo $linesStr

if [$linesStr > 29]
    then echo "log file is bigger than 29 lines"
    #sed -i 1d log
fi

我希望有人能给我一个简单的初学者解决方案。

你可以直接执行 wc -l < log - melpomene
1
wc -l < log 告诉我们 "log" 文件有 30 行,而 $(cat log | wc -l) 则只会返回数字 "30",所以我更倾向于使用后者。 - HuskerDoggo
1
抱歉,我的原始评论中有一个错误。wc -l log 打印出 30 log,但是 wc -l < log 只打印出 30 - melpomene
4个回答

10
  1. 无需使用 cat 命令。
  2. [] 符号周围缺少空格。
  3. 应使用数字比较运算符而不是重定向运算符。

以下是可工作的脚本。

#!/bin/bash

linesStr=$( wc -l < log )

if [[ "$linesStr" -gt "29" ]]; then
    echo Foo
fi

3
不需要使用awk - melpomene
不要试着用它。 - merlin2011
@HuskerDoggo,听起来你复制粘贴了一些无效字符。另外,你是如何运行它的? - merlin2011
1
为什么要使用 awk,当你可以像这样运行 wc -l < log 呢? - 0.sh
2
无论是使用 wc 还是 awk,我们都可以避免子 shell 和管道:awk 'END {print NR}' logwc -l <log 相同,直接打印行数。 - George Vasiliou
显示剩余5条评论

2

你的代码 if 块是错误的 if [$linesStr > 29],在 [] 之间应该有一个空格。

#!/bin/bash

linesStr=$(wc -l < log )
echo $linesStr

if [[ $lineStr -gt 29 ]];then 
    echo "log file is bigger than 29 lines"
fi

建议您在使用if语句时始终使用[[ ]]而不是[ ]。每当您想要比较整数时,请勿使用><,请使用-gt -ge -lt -le。如果您想进行任何形式的数学比较,则建议您使用(( ))

(( lineStr > 29 )) && {
    # do stuff
}

你还应该注意,在使用(( ))时不需要使用bash比较操作符或获取变量值的$


1
在bash中比较数字(man bash-算术运算)可以使用(( ))对硬编码数字进行比较,但是对于变量,存在一个错误:如果其中一个变量保存的不是有效数字(即文本),则算术运算的结果将不正确。使用以下命令进行测试:a = 4; b =“3”; (($a> $b)) && echo“ok”|| echo“not ok”(这个可以正常工作),然后通过分配b =“asd”来重复测试。 - George Vasiliou

1
没有要转换的字符串或整数类型。问题在于您使用了错误的比较运算符。对于数字比较,请使用if [ $linesStr -gt 29 ]。阅读man bash中的CONDITIONAL EXPRESSIONS部分以获取可用的运算符。

1
另外一个问题是[是一个命令(]是该命令的参数),因此您需要在[]周围加上空格。[$linesStr会尝试运行名为[30的命令。 - melpomene

0
(( $(wc -l < log) > 29 )) && echo too long

虽然这个回答在理论上可能解决了问题,但最好在这里包含回答的关键部分,并提供链接作为参考。 - Stephen Rauch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接