sedが絶えず交換されていないようです。 - *失敗

sedが絶えず交換されていないようです。 - *失敗

(通常の数学的優先順位の代わりに)表示される順序でタスクを計算するループを作成しようとしています。コードは次のとおりです(echoはデバッグ用です)。

while [[ "$(echo "$newstring"| grep -E ^-?[0-9]+$)" = "" ]]; do
       oldpart="$(echo "$newstring"|cut -f1-3 -d' ')"
       echo "bla $oldpart"
       newpart="$(echo "$oldpart"|bc)"
       echo "ble $newpart"
       newstring="$(echo "$newstring"|sed -e "s/$oldpart/$newpart/")"
       echo "bli $newstring"
done

$newstringが"6 + 6 * 9"に渡されると、出力は次のようになります。

6 + 6 * 9
bla 6 + 6
ble 12
bli 12 * 9
bla 12 * 9
ble 108
bli 12 * 9
bla 12 * 9
ble 108

6 + 6が期待どおりに12と評価され、次に文字列に置き換えられることがわかります。その後、ジョブは12 * 9、108で再開されます。文字列に置き換えることはできません...中は終わりません。

私はsedが*これを望む置換を妨げていると解釈すると思います。

この動作をバイパスする方法を知っていますか?

ベストアンサー1

bash外部コマンドなしで動作するソリューション

#!/bin/bash
newstring='6 + 6 * 9'

read -a atoms <<<"$newstring"
run=${atoms[0]}               # Initialise running total to the first value

for ((i=1; i<=${#atoms[@]}; i+=2))
do
    op=${atoms[$i]}           # Next operator
    num=${atoms[$((i+1))]}    # Next number
    run=$((run $op num))      # Perform the arithmetic (integer maths)
done
echo "$run"

浮動小数点演算を使用するには、bcまたはを使用する必要がありますdc。このバリアントはdc次のように使用します。コメントにおすすめ

#!/bin/bash
newstring='6.5 + 6 * 9'

{
    read -a atoms <<<"$newstring"

    run=${atoms[0]}
    printf "%s " "$run"

    for ((i=1; i<=${#atoms[@]}; i+=2))
    do
        op=${atoms[$i]} num=${atoms[$((i+1))]}
        printf " %s %s" "$num" "$op"
    done
    printf " p\n"
} | dc

おすすめ記事