web-dev-qa-db-ja.com

パイプに追加して渡しますか?

2つの数値を分割する単純なbash関数があります。

echo "750/12.5" | bc

bcから出力を取得して/24を追加し、その結果をbcの別のインスタンスにパイプしたいと思います。

何かのようなもの:

echo "750/12.5" | bc | echo $1 + "/24" | bc

ここで、$1はパイプされた結果です。

追記:echo "750/12.5/24" | bcを実行するだけで十分だと思います。私の質問は、パイプの結果へのテキストの追加に関するものです。

6

最も単純なオプションでは、これはパイプストリームに追加されます。

$ echo "750/12.5" | { bc; echo "/24"; }
60
/24

ただし、予期しない改行が含まれているため、trを使用する必要があることを回避します。

$ echo "750/12.5" | { bc | tr -d '\n' ; echo "/24"; }
60/24

または、コマンド展開によって後続の改行が削除されるという事実を考えると、

$ printf '%s' $( echo "750/12.5" | bc ); echo "/24"
60/24

しかし、おそらく、正しい方法は次のようになります。

$ echo "$(echo "750/12.5" | bc )/24"
60/24

これは、bcで使用するために、次のように書くことができます。

$ bc <<<"$(bc <<<"750/12.5")/24"
2

妥当な浮動小数点数の精度を得るには、次のようにする必要があります。

$ bc <<<"scale=10;$(bc <<<"scale=5;750/12.5")/24"
2.5000000000

Bcのインスタンスが2つあるため、2つのスケールの必要性に注意してください。

もちろん、bcの1つのインスタンスに必要なスケールは1つだけです。

$ bc <<<"scale=5;750/12.5/24"

実際、あなたが考えるべきことは文字列の観点からです:

$ a=$(echo "750/12.5")        # capture first string.
$ echo "$a/24" | bc           # extend the string
2

上からのスケールに関するコメントは、ここでも有効です。

2
Isaac

私はsedを使用してこれを達成し、行の終わりを置き換えました:

echo "my text" | sed 's/$/ more text/'

戻り値:

my text more text

あなたの例:

echo "750/12.5" | bc | sed 's/$/\/24/' | bc
10
Hugo Wride

このような何かはxargsを使用して動作するようです:

$ echo "750/12.5" | bc |xargs -I{} echo "{}+20" |bc
80

あるいは:

$ echo "750/12.5" | bc |echo "$(</dev/stdin)+20" |bc
80

そしてなぜそうではないのですか?

$ bc <<<20+$(bc <<<"750/12.5")
80
1
George Vasiliou