2016-03-30 1 views
1

これは、温度センサーから値を読み取り、それらを1行に表示する私のBashスクリプトです。配列の要素をカンマで区切ります(例:[1,2,3,5])。次に、この文字列で別のファイルに存在する行を置き換えます。私の配列をBashの文字列に変換するには?

temp.sh

function join() 
{ 
    local IFS="$1" 
    shift 
    echo "$*" 
} 

その後、我々は呼び出すことができます:

READINGS="[$(join "," "${field[@]})"]" 

#!/bin/bash 
for ((i=0 ; 12 - $i ; i++)) 
    do 
    x=$(cat /sys/bus/w1/devices/28-0000075292ed/w1_slave | grep "t=" | awk -F "t=" '{print $2/1000}') 
    field[$i]=$x 
    echo "${field[$i]}" 
done | column 
+0

が 'ここで何をやってCOLUMN'です発見したありがとう! 'echo'は与えられた行に複数の値を出力しますか?このコマンドの出力はどういうものですか? 'column'を使わないとどうなりますか? –

+0

ループを通過するたびに同じデバイスをサンプリングするのはなぜですか? –

+0

@EtanReisner私は、温度を何度も取得し、その値などを平均すると仮定しています。これらのセンサの多くは、間に眠らずに何度も何度も読まれるのが好きではありません。 – Will

答えて

1

は私が解決策

#!/bin/bash 
f="myArray_a = [" 
for ((i=0 ; 12 - $i ; i++)) 
    do 
    x=$(cat /sys/bus/w1/devices/28-0000075292ed/w1_slave | grep "t=" | awk - F "t=" '{print $2/1000}') 
    if [ $i -eq 11 ] 
    then 
    x=$(printf %.3f] $x) 
    f="$f $x" 
    echo "$f" 
    else 
    x=$(printf %.3f, $x) 
    f="$f $x" 
    fi 



done | column 
4

だから我々はこれを行うことが一つの方法は、多くの言語で提供さjoin()機能をエミュレートすることですここに例があります:

$ MY_ARRAY=("one" "two" "three") 
$ join "," "${MY_ARRAY[@]}" 
one,two,three 

これは、BashのInternal Field Separatorを変更することで機能します。 $*は、$IFSをセパレータとして使用してすべての引数を展開するために使用されます。

またjoin機能を回避し、ちょうどこのようにそれを行うことができます:

READINGS="[$(IFS=","; echo "${field[*]}")]" 
+0

私はそれをしようとしたとき、それはIFSなしと同じ結果を示しています。パイの@ raspberrypi:〜$ ./temp。 sh 21.437 \t 21.437 \t 21.437 \t 21.437 \t 21.437 \t 21.437 \t 21.437 \t 21.437 \t 21.5 \t 21.5 \t 21.5 \t 21.5 – user5996908

+0

どちらの方法も機能しませんでしたか? – Will

+0

そうでない場合は、新しいコードを質問に編集して投稿してみてください。 – Will

関連する問題