2017-12-02 4 views
0

数字から値のリストを減算したい。シェル:番号間でマイナスを行う方法

DATACOME=1013 
DATAREF=1010 
1020 

var=$((DATACOME - DATAREF)) 
echo "$var" 
3 

をそれが$DATAREF出力3の代わりに最初の値に対してだけ動作します。私が試し

echo "$var" 
3 
-7 
+0

別の言語を選択してください。 'bash'は汎用プログラミング言語として意図されていません。 – chepner

答えて

2

直接的なアプローチは、アレイのような値のリストを保存することですdatarefを呼び出して、ループを使用して繰り返します。ループ:

datacome=1013 
dataref=(1010 1020) 

for num in "${dataref[@]}"; do 
    echo $((datacome - num)) 
done 

あなたは空白文字で区切られた文字列に値を格納し、awkを使用することができ、配列を使用したくない場合は、次の言葉のを使用してforループと

datacome=1013 
dataref="1010 1020" 

awk -v num="$datacome" '{ 
    for (i = 1; i <= NF; i++) { 
     print num-$i 
    } 
}' <<< "$dataref" 

か、再度分割この時間:

datacome=1013 
dataref="1010 
1020" 

for num in $dataref; do 
    echo $((datacome - num)) 
done 

とき、またはあなたを格納するファイルを使用して値:

#input_file: 
#1010 
#1020 

datacome=1013 

while read num; do 
    echo $((datacome - num)) 
done < input_file  
awk -v num="$datacome" '{ 
    for(i = 1; i <= NF; i++) { 
     print num-$i 
    } 
}' < input_file 

EDIT: @の仲の良い友達の推薦で、これはbcでこれを行うには多くの可能な方法の一つである:

datacome=1013 
dataref="1010 1020" 

for num in $dataref; do 
    echo "$num-$datacome" 
done | bc -l 

本当にありますこれを行う方法がたくさんある。また、を入力しないでくださいは大文字の変数を環境変数や内部シェル変数と衝突させる可能性があるため使用してください。

+1

すばらしい答え。 'bc'に言及することもできますが、そうでなければ完璧です。 – dawg

関連する問題