前書き

自動化Script作成時に、Bash (Shell Script)ではなく、RubyやPython3を用いた方がScriptのメンテナンス負荷が低くなります。自動化Scriptに使用するプログラミング言語変更を目的として、各言語の実装を比較します。

本記事では、ユーザからのキーボード入力を受け付ける方法を比較します。比較では、実装例および実行例をそれぞれ示します。

Bashではなく、RubyやPython3を使った方が好ましい理由は、以下の記事に記載しています。この記事には、各プログラミング言語の様々な実装(ディレクトリ操作やファイル操作など)を比較した他記事へのリンクを一覧にまとめています。

各言語のVersion

  • Bash:GNU bash, バージョン 5.0.3(1)-release
  • Ruby:ruby 2.5.5p157 (2019-03-15 revision 67260)
  • Python:Python 3.7.3

比較:ユーザ入力の受け付け

自動化Scriptでは、ある程度処理が進んだ後に、処理を継続してよいかをユーザに尋ねる機会が多いです。そのような場合に、キーボード入力を受け付け、入力されたキーに応じた処理を実施します。

以下に、各言語の実装例および実行例を示します。

Bashの場合

#!/bin/bash

# "Yes", "Y", "y"のいずれかが入力されるまで、入力を受け付ける例
# echoコマンドに-nオプションを付ける事で、改行無し。
while true
do
    echo -n "次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:"
    read input
    case ${input} in
    "y" | "Y" | "Yes")
        echo "次の処理に進みます。"
        # breakして、ループを抜ける。
        break ;;
    "n" | "N" | "No")
        echo  "キー入力を再度待ちます。"
        # breakしないため、無限ループする。
        ;;
    *)
        # 入力受付のデフォルト値。こちらもbreakせず、無限ループする。
        echo  "${input}:未対応のキー入力"
        ;;
    esac
done

echo "ユーザ入力の受付終了"

Rubyの場合

#!/usr/bin/env ruby

# "Yes", "Y", "y"のいずれかが入力されるまで、入力を受け付ける例
while true
  printf("次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:")
  input = gets()
  case input.chomp! 
  when "y", "Y", "Yes" then
    printf("次の処理に進みます。\n")
    break
  when "n", "N", "No" then
    printf("キー入力を再度待ちます。\n")
  else
    printf(input + ":未対応のキー入力\n")
  end
end

printf("ユーザ入力の受付終了\n")

Python3の場合

#!/usr/bin/env python3

import sys

while True:
    key_input = input("次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:")
    # PythonにSwitch-case文は存在しない。
    if key_input  in {"y", "Y", "Yes"}:
        print("次の処理に進みます。")
        break
    elif key_input in {"n", "N", "No"}:
        print("キー入力を再度待ちます。")
    else:
        print(key_input + ":未対応のキー入力")

print("ユーザ入力の受付終了")

Bash、Ruby、Python3の実行例

$ ./bash.sh 
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:n
キー入力を再度待ちます。
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:No
キー入力を再度待ちます。
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:N
キー入力を再度待ちます。
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:bash
bash:未対応のキー入力
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:Yes
次の処理に進みます。
ユーザ入力の受付終了

$ ./ruby.rb 
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:No
キー入力を再度待ちます。
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:n
キー入力を再度待ちます。
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:N
キー入力を再度待ちます。
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:ruby
ruby:未対応のキー入力
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:y
次の処理に進みます。
ユーザ入力の受付終了

$ ./python.py 
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:N
キー入力を再度待ちます。
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:n
キー入力を再度待ちます。
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:No
キー入力を再度待ちます。
次の処理に進む場合はYes、再度キー入力を受け付ける場合はNo:Y
次の処理に進みます。
ユーザ入力の受付終了