使用if语句比较shell中的两个字符串

时间:2013-10-14 02:36:52

标签: bash shell

这可能是一个愚蠢的问题,但我在脚本编写时从来没有这样的事情。所以任何帮助都会受到赞赏。

我正在处理人口普查的数据并且必须生成报告。 文件中的每一行都有姓氏,频率等。我必须抓住频率。 但如果我抓住一些频率为" 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

2 个答案:

答案 0 :(得分:1)

第一个陈述

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 }'

答案 1 :(得分:0)

  1. 选择一个shell。 Bourne Again Shell(bash)和basic / 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. 不同
  6. 转储shell。运行Python或其他“真正的”语言通常比五行以上的任何shell脚本更清晰,更易于维护。