LoginSignup
8
10

More than 5 years have passed since last update.

bashとPythonとGoでのy/n処理

Last updated at Posted at 2015-10-25

ちょっとしたCLIツールを作るときによく使う、[y/n]を表示して確認や対象指示を促す処理。それをGo,Python,bashの3つでのやりかたです。

やっていることは、
are you okay?と聞いて、No(n)とだけ答えたらoh no.、それ以外はyeah good.と表示します。

  • メッセージの表示
  • 標準入力からの改行(Enter)までの入力
  • 前後スペーストリム
  • 判別

bash

#!/bin/bash

read -p "are you okay?[Y/n]" ans
if [ "$ans" = "n" ]; then
  echo "oh no."
else
  echo "yeah good."
fi

readを使い、シンプルに読み込んで後はそれに対する処理を書くだけです。readがホワイトスペースで分割し、ansに格納します。その際に前後のホワイトスペースが除去されています。
※コメントいただいた内容をもとに編集。

Python

from sys import stdin

print "are you okay?[Y/n]"
ans = stdin.readline()

if ans.strip() == "n":
    print "oh no."
else:
    print "yeah good."

bashとほぼ同じですが、1箇所違うのが、readline()で読み込んだ文字列は末尾に改行を含んでいます。
今回はstrip()で一緒に除去されていますが、そうでないときは、rstrip()などで末尾だけとって使います。
そのまま文字列比較すると改行が一致しないので、意図しない動きになります。

Go

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    fmt.Println("are you okay?[Y/n]")
    reader := bufio.NewReader(os.Stdin)

    ans, err := reader.ReadString('\n')
    if err != nil {
        fmt.Print("input err:", err)
        os.Exit(1)
    }

    if strings.TrimSpace(ans) == "n" {
        fmt.Println("oh no.")
    } else {
        fmt.Println("yeah good.")
    }
}

さすがにmainやエラー処理を書く分、bash,Pythonと比べると長くなります。GoもPythonと同じく改行が含まれるので、strings.TrimSpace()strings.TrimRight()などで適宜削除して使います。

8
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10