ChatGPT(+Shell GPT)を使って簡単な計算を行う電卓シェルスクリプトを生成してみた

2023-03-27Bash,ChatGPT

はじめに

Linux では、シェルスクリプトを使って簡単な計算ができます。

今回は、シェルスクリプトを使って 2 つの数値を入力し、指定された演算子を使って計算するプログラムを作成しました。
ただし、自分ではロジックを一切書かず、ChatGPT に生成してもらうことにしました

ChatGPT API 呼び出し方法として、 前回紹介した Shell GPT を使います。

検証環境

$ uname -moi
arm64 unknown Darwin

$ zsh --version
zsh 5.9 (arm-apple-darwin21.3.0)

$ python --version
Python 3.11.2

ChatGPT API はトライアル版のものを利用しました
言語モデルは GPT-3.5 です。

Shell GPT さんと僕のやり取り

ここからは、 電卓シェルスクリプトを作成するまでの Shell GPT さんと僕のやりとり ( シェル操作 ) をなるべく加工無しでそのまま紹介します。

1 回目のやりとり

$ sgpt --chat "calculator" --shell "電卓プログラムを生成して"
Sorry, I cannot fulfill this request as it is in Japanese and it is not clear what is being asked. Please provide a request in English with clear details on what needs to be done.

何言ってるかわからん、と言われてしまった。

2 回目のやりとり

文言を少し変えて、再度お願いしてみました。

$ sgpt --chat "calculator" --shell "電卓の機能を実現するシェルスクリプト"
To create a shell script that implements a calculator function, you can use the following zsh commands:

1. Create a new file for the shell script:
   touch calculator.sh

2. Open the file in a text editor:
   nano calculator.sh

3. Add the following code to the file:
   #!/bin/zsh
   echo "Enter first number:"
   read num1
   echo "Enter second number:"
   read num2
   echo "Select operation (+ - * /):"
   read op
   result=$(echo "scale=2;$num1$op$num2" | bc)
   echo "Result: $result"

4. Save and close the file:
   Ctrl+O
   Ctrl+X

5. Make the file executable:
   chmod +x calculator.sh

6. Run the script:
   ./calculator.sh

7. Follow the prompts to enter the numbers and select the operation. The script will calculate the result and display it on the screen.

3 で出力されているシェルスクリプトを見ると、1 回で計算処理が終わってしまうようでした。

電卓っぽく、継続して計算を続けたいので、再度依頼してします。

3 回目のやりとり

ここから、生成されたスクリプトを実際にシェルスクリプトファイルに保存して実行してみました。

$ sgpt --chat "calculator" --shell "前の計算結果を使って継続して次の計算が行えるようにして"
To create a shell script that allows using the previous result for the next calculation, you can use the following zsh commands:

1. Create a new file for the shell script:
   touch calculator.sh

2. Open the file in a text editor:
   nano calculator.sh

3. Add the following code to the file:
   #!/bin/zsh
   result=0
   while true; do
       echo "Enter first number:"
       read num1
       echo "Enter second number:"
       read num2
       echo "Select operation (+ - * /):"
       read op
       if [[ $op == "q" ]]; then
           break
       fi
       if [[ $result -ne 0 ]]; then
           num1=$result
       fi
       result=$(echo "scale=2;$num1$op$num2" | bc)
       echo "Result: $result"
   done

4. Save and close the file:
   Ctrl+O
   Ctrl+X

5. Make the file executable:
   chmod +x calculator.sh

6. Run the script:
   ./calculator.sh

7. Follow the prompts to enter the numbers and select the operation. To use the previous result, simply press enter without entering a number for the first prompt. To quit the program, enter "q" for the operation prompt.

3 で出力された内容を calculator.sh というファイルに保存します。
また 5 に書かれている通り、実行権限を付与しておきます。

$ vi calculator.sh

$ chmod +x calculator.sh

実行してみます。

$ ./calculator.sh
Enter first number:
30
Enter second number:
15
Select operation (+ - * /):
+
Result: 45
Enter first number:
15
Enter second number:
20
Select operation (+ - * /):
*
Result: 900
Enter first number:
^C

ちゃんと計算が継続されていますが、 2 回目に入力された Enter first number: のあとの 15 という数字が使われていません。
1 回目の計算結果 45Enter second number: の値 20 が掛け算されて 900 となっているようです。

2 回目は数値を 1 回だけ入力するようにします。

4 回目のやりとり

$ sgpt --chat "calculator" --shell "二回目以降の計算は、first numberの入力をスキップできるようにして"
...(省略)...

3. Add the following code to the file:
   #!/bin/zsh
   result=0
   num1=0
   while true; do
       if [[ $num1 -eq 0 ]]; then
           echo "Enter first number:"
           read num1
       fi
       echo "Enter second number:"
       read num2
       echo "Select operation (+ - * /):"
       read op
       if [[ $op == "q" ]]; then
           break
       fi
       if [[ $result -ne 0 ]]; then
           num1=$result
       fi
       result=$(echo "scale=2;$num1$op$num2" | bc)
       echo "Result: $result"
   done

...(省略)...

実行してみます。

$ ./calculator.sh
Enter first number:
15
Enter second number:
3
Select operation (+ - * /):
+
Result: 18
Enter second number:
3
Select operation (+ - * /):
-
Result: 15
Enter second number:
*
Select operation (+ - * /):
2

Parse error: bad expression
    <stdin>:1

Result:
Enter second number:
2
Select operation (+ - * /):
*
Result: 30
Enter second number:
^C

$ ./calculator.sh
Enter first number:
15
Enter second number:
3
Select operation (+ - * /):
+
Result: 18
Enter second number:
2
Select operation (+ - * /):
*
Result: 36
Enter second number:
4
Select operation (+ - * /):
/
Result: 9.00
Enter second number:
^C

動きは良さそうなのですが、僕のほうが1度入力間違いしてしまいました。
数値を入力してから演算子 (+ - * /) を入力するというのがどうも直感的ではありません。

5 回目のやりとり

$ sgpt --chat "calculator" --shell "second numberの入力の前に、operationの入力を行うようにして"
...(省略)...

3. Add the following code to the file:
   #!/bin/zsh
   result=0
   num1=0
   while true; do
       if [[ $num1 -eq 0 ]]; then
           echo "Enter first number:"
           read num1
       fi
       echo "Select operation (+ - * /):"
       read op
       if [[ $op == "q" ]]; then
           break
       fi
       echo "Enter second number:"
       read num2
       result=$(echo "scale=2;$num1$op$num2" | bc)
       echo "Result: $result"
       num1=$result
   done

...(省略)...

実行してみます。
今度は演算子を入力後に数値の入力が促されていい感じです。

$ ./calculator.sh
Enter first number:
3
Select operation (+ - * /):
+
Enter second number:
2
Result: 5
Select operation (+ - * /):
-
Enter second number:
1
Result: 4
Select operation (+ - * /):
*
Enter second number:
3
Result: 12
Select operation (+ - * /):
*3
Enter second number:
3
Result: 396
Select operation (+ - * /):
-
Enter second number:
400
Result: -4
Select operation (+ - * /):
/
Enter second number:
2
Result: -2.00
./calculator.sh: line 5: [[: -2.00: syntax error: invalid arithmetic operator (error token is ".00")
Select operation (+ - * /):
+
Enter second number:
5
Result: 3.00
./calculator.sh: line 5: [[: 3.00: syntax error: invalid arithmetic operator (error token is ".00")
Select operation (+ - * /):
^C

小数が発生しだすとエラーがで始めましたが、それまでは概ね想定どおりです。

まだまだ改善できそうでしたが、今回はこのあたりで作業を中断しました。

ひとこと

かんたんなシェルスクリプトであれば ChatGPT とのやりとりで生成できそうですが、テストや生成されたコードのレビュースキルが求められそうです。

2023-03-27Bash,ChatGPT