Bashスクリプトの算術

Bashスクリプトの算術

Bashスクリプトで入力に基づいて最大値または最小値を決定しようとしています。たとえば、入力がある場合、出力はでなければmax 20 40なりません40。入力がある場合、出力はでなければmin 20 40ならず、20任意の2つの数字についても同様です。

加算、減算、乗算、除算にも同じ操作が必要です。入力がある場合、6 + 6出力はです12。入力がある場合、6 * 6出力はです36

私が経験している問題は、bashに2つの数値を再エコーし、最小値または最大値を表示または加算、減算などを実行するように指示できることです。たとえば、入力が5 10出力の場合、15追加ファイルを実行する場合です。しかし、入力があり、5 + 10出力が15

これで、最大/最小操作を忘れて、ソリューションの算術部分に集中できます。問題をよりよく説明するには、コードを次のように実行する必要があります。

bash filename.sh
6 * 7
42

最初の行はファイルを実行する場所、2行目は入力を入力する場所、最後の行は出力(答え)、その後に新しい行が続きます。を掛けるととても簡単です6 * 7。しかしそうではありません。ファイルを実行しbash filename.shてEnterをクリックすると、加算、減算、乗算、除算に制限される単純な算術演算を入力できる次の行に移動する必要があります。

コードの実行方法の追加例

bash filename.sh
10+ 5
15
bash filename.sh
14 / 7
2
bash filename.sh 
17 - 3
14

スクリプトは、入力されたすべての値に対してこれを実行できる必要があります。ありがとうございます。

答え1

この問題は、2つの簡単な質問に分けることができます。

  1. 4つの算術演算はどのようにできますか?
  2. どの数字が小さいか大きいかどうかはどうすればわかりますか?

4つの算術演算

記号を使用してこれを行うことができます$((expr))。より多くの情報を見たいかもしれませんman bash。例:

$ echo $((6 + 6))
12
$ echo $((6 * 6))
36

数量が少ない/多い

2つを比較できます数字[[ expr ]]または形です[ expr ]。私は[[ expr ]]フォーマットを好むので、ここにいます。小さい[[ $num1 -lt $num2 ]]場合は数値を比較します。そして鋼板であることを確認してください。 andはandとして書き込めません。数値順ではなくアルファベット順に比較されます。$num1$num2-gt-lt-gt<>

例:

function max() {
  first=$1
  second=$2
  if [[ $first -lt $second ]]; then
    echo $second
  else
    echo $first
  fi
}

function min() {
  first=$1
  second=$2
  if [[ $first -gt $second ]]; then
    echo $second
  else
    echo $first
  fi
}

使用法:

$ max 20 40
40
$ min 20 40
20

答え2

入力値と計算値を一行に印刷するという意味ですか?

list.txtあなたの質問のリストは次のとおりです。

$ cat list.txt
1 + 2
3 + 4
5 + 10

calculating.shスクリプトは文字列入力を受け入れ、計算された値を印刷します(ここでは+演算のみを作成しました)。

$ cat calculating.sh
#!/bin/bash

varA=$(echo $1 | cut -d' ' -f1)
varB=$(echo $1 | cut -d' ' -f3)
operator=$(echo $1 | cut -d' ' -f2)

echo $(($varA + $varB))

list.txtスクリプトを使用して各項目を計算するには、calculating.sh次のようにします。

$ cat list.txt | xargs -I {} sh -c "echo -n {} '= ' && ./calculating.sh '{}'"

1 + 2 = 2
3 + 4 = 6
5 + 10 = 10

xargs"echo -n {} '= ' && ./calculating.sh '{}'"list.txt各行を参照するrunコマンドの各行を作成します{}(各行を繰り返すと思います)。echo -n {} =あなたの質問行は改行なしで=文字で印刷されます。これにより、./calculating.sh '{}'計算された値が印刷されます。

答え3

高速で汚れた式が必要な場合は、入力式をシェルの算術拡張にプッシュできます。

$ cat arith.sh
#!/bin/bash
read -r expr
if [[ $expr = *\$* || $expr = *\`* ]]; then
    echo "invalid entry!" >&2
    exit 1
fi
echo "$(($expr))"

だから例えば

$ ./arith.sh 
(10+4)*5
70

このセクションのテストでは、ifコマンド置換を挿入するために使用できるドル記号またはバックティックを含む入力を拒否します。無効な算術構文はシェルでエラーを発生させます。

比較には、C スタイルの比較演算子 ///<および三<=項演算子を使用できます。たとえば、合計の最大値を指定します。>>=$((a > b ? a : b))ab

maxしたがって、スクリプトを使用して拡張するには、次のようにしますmin

$ cat arith2.sh
#!/bin/bash

read -r expr

if [[ $expr = *\$* || $expr = *\`* ]]; then
    echo "invalid entry!" >&2
    exit 1
fi

if [[ $expr = "max "* ]]; then
    read -r op a b <<< "$expr"
    echo "$((a > b ? a : b))"
elif [[ $expr = "min "* ]]; then
    read -r op a b <<< "$expr"
    echo "$((a < b ? a : b))"
else 
    echo "$(($expr))"
fi

max 1 2 3これがどのように機能するかによって入力が破損し、readBashは浮動小数点数をサポートしないため、エラーも発生します。入力データのソースに応じて完全であることを確認することをお勧めします。

関連情報