【问题标题】:using an if statement to compare two strings in shell使用 if 语句比较 shell 中的两个字符串
【发布时间】:2013-10-21 13:47:19
【问题描述】:

这可能是一个愚蠢的问题,但我从来没有在脚本中遇到过这样的事情。因此,我们将不胜感激。

我正在处理来自人口普查的数据并且必须生成报告。 文件中的每一行都有一个姓氏、频率等。我必须抓住频率。 但是,如果我抓住一些频率为“0.000”的姓氏,那么我必须将其更改为“0.00025”。我试图做一个 if 语句,但不知道该怎么做。

#!/bin/bash
all=/homes/ddailey/public_html/data/dist_all_last

count=`grep -w $1 $all | awk '{ print $2 }'`

if [ $count == "0.000" ]; then
   echo .00025
else
   echo $count
fi

【问题讨论】:

  • 这并不完美,但看起来应该按照您的描述进行。它有什么问题?
  • 是的,我知道它并不完美,只需几分钟后将其放在一起。问题是,如果 $count 对 0.000 的字符串进行 greps,它不会将其更改为 .00025。它只是保持在 0.000
  • 正如所写,它不应该改变count的值,但它应该echo .00025。它会这样做吗?
  • 文件有多少行?如果有多个,那就麻烦了。另请参阅How to debug a shell script。
  • 它不回显 .00025,它回显的是 .000...但它们在文件中不止一行

标签: bash shell


【解决方案1】:
  1. 选择一个外壳。 Bourne Again Shell (bash) 和基本的 /bin/sh 都很流行。还有许多其他选项您不应该使用。

  2. 具体建议。谷歌。真的。请参阅Compare a string in Unix 以获得答案,如果使用 bash,请参阅 How do I compare strings in Bourne Shell?。

  3. 观察空间。 Shell 编程对空格很敏感,因此拥有或忘记空格会破坏脚本。例如,确保记住“[”或“]”前后的空格。让它运行通常涉及添加和删除空格。

  4. 注意空替换。 if [ $nosuchvar = 3 ] 会出错,但 if [ "$nosuchvar" = 3 ] 不会。另外,全局替换,所以if [[ $foo == "a*" ]] 不同于if [ $foo == "a*" ]

  5. 转储外壳。运行 Python 或其他“真正的”语言通常比任何超过 5 行的 shell 脚本更简洁、更易于维护。

【讨论】:

    【解决方案2】:

    第一句话

    count=`grep -w $1 $all | awk '{ print $2 }'`
    

    正在返回由换行符分隔的值的列表。一个简单的echo 不会显示换行符,但这会:

    echo "$count"
    

    但是,if 语句需要单个值,因此如果您在 $count 中有两个或多个结果,它将与单个测试值不匹配。您需要做的是遍历$count 中的值。请尝试以下操作:

    counts=`grep -w $1 $all | awk '{ print $2 }'`
    for count in $counts
    do
        if [ $count == "0.000" ]; then
           echo .00025
        else
           echo $count 
        fi
    done
    

    我更喜欢以下设计,它将所有逻辑都放入 awk 命令中。这样可以将所有处理逻辑保存在一个脚本中,而不是拆分为 awk 和 bash。

    grep -w $1 $all |
    awk '{ if ($2 == "0.000") $2 = "0.00025"; print $2 }'
    

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      相关资源
      最近更新 更多