2013-10-14 129 views
2

這可能是一個愚蠢的問題,但我從來沒有在腳本編寫中這樣做過。所以任何幫助,將不勝感激。使用if語句比較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 
+0

這並不完美,但它看起來應該按照你的描述進行。它有什麼問題? – kojiro

+0

是的,我知道它不完美,只需幾分鐘就把它放在一起。問題是,如果$ count greps一個0.000的字符串,它不會將其更改爲.00025。它只是保持在0.000 – Sampson

+0

正如書面它不應該改變'計數'的價值,但它應該*回聲* .00025。它是否這樣做? – kojiro

回答

0
  1. 選擇一個殼。 Bourne Again Shell(bash)和basic/bin/sh都很受歡迎。還有其他一些你不應該使用的選項。

  2. 具體的建議。谷歌。真。如果使用bash,請參閱Compare a string in UnixHow do I compare strings in Bourne Shell?

  3. 觀察空間。 Shell編程對空白區域很敏感,因此有或忘記空格會破壞腳本。例如,確保您記住'['或']'前後的空格。運行它通常涉及添加和刪除空格。

  4. 注意空替換。 if [ $nosuchvar = 3 ]發生錯誤,但if [ "$nosuchvar" = 3 ]沒有。另外,glob替換,所以if [[ $foo == "a*" ]]if [ $foo == "a*" ]不同

  5. 轉儲shell。運行Python或其他「真實」語言通常比五行以上的任何shell腳本更清潔,更易維護。

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