ちょっとした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()
などで適宜削除して使います。