2016-05-31 8 views
0

ファイルを1行ずつ読み込み、各繰り返しチェックで5番目の配列要素を+または - (プラスまたはマイナス)文字にします。私は行ごとにファイルを読むことができますが、+/-を認識するためにif/else文を取得することはできません。Bash if else文が+/-文字を認識しない

バッシュコードIは、それぞれの下

#!/bin/bash 
# save the field separator 
old_IFS=$IFS 
while IFS=$'\t' read -r -a myArray 
do 
    echo "${myArray[5]}" 
    if [ $myArray[5] = "+" ]; then 
     echo plus 
    elif [ $myArray[5] = "-" ]; then 
     echo minus 
    else 
     echo no 
    fi 
done < /Users/Alex/Desktop/test.bed 

# restore default field separator 
IFS=$old_IFS 

サンプル入力

Scaffold1 34 39 name . - 
Scaffold1 12 17 name . - 
Scaffold1 17 12 name . + 
Scaffold1 43 49 name . + 
Scaffold1 45 48 name . - 

サンプル出力

- 
no 
- 
no 
+ 
no 
+ 
no 
- 
no 

を書かれている+/-それはプラスまたはマイナスのいずれかを言うのではなく、ノー述べなければなりません条件文が失敗したことを示します。これが正しく出力されたら、エコーコマンドを変更して、符号に応じて列2または3のいずれかで算術演算を行います。

+1

あなたは '' {[5] MyArrayという}正しい値、 '$をecho'ingが、その後間違っを比較しています1つは、 '$ myArray [5]'です。 –

+1

また、あなたの展開を引用してください。 '[" $ {myArray [5]} "= +]' - 左側が唯一の展開なので、実際にここで引用する必要があるのは唯一の部分です。右辺はそれ自体を表現する単純なリテラルであり、グロブとして解釈することはできませんので、そのまま安全です。 –

+0

...でも、bashであれば、 '[[$ {myArray [5]} = +]]'で引用する必要はありません。 (まあ、*ほぼ* - それはグロブスタイルのパターンマッチとして右辺を扱うので、文字通りの比較を望んでいて、右手がグロブ中心の文字だったら、あなたは欲しい見積もり領土)。 –

答えて

5

あなたが必要:

${myArray[5]} 

ない:

$myArray[5] # this is equivalent to "${myArray[0]}[5]" 

ところで、代わりにcase文を考えてみます。

case ${myArray[5]} in 
    -) echo minus ;; 
    +) echo plus ;; 
    *) echo no ;; 
esac 

あなたはまたの必要性を避けることができ配列 - とth私たちはあなたのコードのPOSIX shの互換性を持たせる - 各列に対してreadに名前付き引数を使用して:

while IFS=$'\t' read -r scaffold num1 num2 name dot col _; do 
    : "$col" refers to your fifth column here 
done 
+0

ありがとう、私は明らかにあまりにも疲れています。 – Alex

+0

@Alex、...私はいくつかの休憩を取った後に、考えられる改善についていくつかの注意を追加しました。 :) –