【问题标题】:bash: convert string to int & if int > #bash: 将字符串转换为 int & if int > #
【发布时间】:2017-06-30 03:31:40
【问题描述】:

我想要一个 bash 脚本来检查文件的行数是否超过 # 行,但我还没有让它正常工作,我不太确定如何去做。 我以前从未使用过 bash。

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

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

我也觉得 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
  • wc -l
  • 抱歉,这是我原始评论中的一个错误。 wc -l log 打印 30 log,但 wc -l < log 只打印 30

标签: string bash if-statement int


【解决方案1】:
(( $(wc -l < log) > 29 )) && echo too long

【讨论】:

【解决方案2】:
  1. 不需要cat
  2. [] 周围没有空格。
  3. 使用数字比较运算符代替重定向运算符。

这是一个工作脚本。

#!/bin/bash

linesStr=$( wc -l < log )

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

【讨论】:

  • 不需要awk
  • 不试一试。
  • 用你的脚本我得到:-bash: test.bash: line 15: syntax error near unexpected token fi' -bash: test.bash: line 15: fi'
  • 当你可以做这样的事情时为什么要使用 awk wc -l &lt; log
  • 无论是wc还是awk,我们都可以避免子shell和管道:awk 'END {print NR}' logwc -l &lt;log一样=直接打印行数。
【解决方案3】:

如果代码块错误if [$linesStr &gt; 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;&lt;,使用-gt -ge -lt -le。如果您想进行任何形式的数学比较,建议您使用(( ))

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

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

【讨论】:

  • 比较 bash 中的数字(man bash - 算术评估)可以使用 (( )) 来完成硬编码数字,但使用变量存在错误:如果其中一个变量持有无效数字(即text) 算术评估的结果不正确。测试它:a=4;b="3";(($a&gt;$b)) &amp;&amp; echo "ok" || echo "not ok"(这很好)然后通过分配b="asd"重复测试。
【解决方案4】:

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

【讨论】:

  • 另一个问题是[ 是一个命令(而] 是该命令的一个参数),因此您需要在[] 周围使用空格。 [$linesStr 将尝试运行名为 [30 的命令。
猜你喜欢
  • 2011-10-02
  • 2011-03-06
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多