読者です 読者をやめる 読者になる 読者になる

peanutice’s blog

日々の記録用。 日記としての利用や 読んだ本や学習したことを記録します。

シェルスクリプトでキーボードからの入力を取得

先日Linuxでキーボードからの入力に応じてコマンドを実行するシェルスクリプトを書きました。

しかし、何故かキーボードからの入力と比較を行ったif文の条件式がで嵌まって上手くいかなかったので備忘録として書いておきます。

 

結果的にはスペースのつけ忘れでした。

 

動作テストとして「inputkey.sh」というファイルを作成して以下のコードを記述して実行していました。※以下のコードは正常に動作しません!!

#!/bin/sh
read -p "input a or d : " input

if ["${input}" = "a"]; then
echo input a OK
elif ["$input" = "s"]; then
echo input s OK
else
echo input other key
fi

 上記のコードを以下のコマンドで実行

$ ./inputkey.sh

実行権限を付加していなくて実行できない場合には、以下のコマンドを実行した後に再度上記コマンドを実行します。

$ chmod +x inputkey.sh

 以下が実行結果です。実行後に「a」を入力しています。

xubuntu-64bit@xubuntu64bit:~/Desktop$ ./inputKey.sh
input a or d : a
./inputKey.sh: 4: ./inputKey.sh: [a: not found
./inputKey.sh: 6: ./inputKey.sh: [a: not found
input other key

 結果的に上記のエラーが発生していました。

 問題点としては以下の部分のコードを

if ["${input}" = "a"]; then
elif ["$input" = "s"]; then

 [ ] のところにスペースを入れて以下のように書き換えれば正常に動作します。

if [ "${input}" = "a" ]; then
elif [ "$input" = "s" ]; then

よく見れば

[a: not found

「[a」が見つかりませんとなっているので分かるはずですが、

ほとんどシェルスクリプトを書いたことが無いこともあって

当初問題が全くわからずに何時間か解決に頭を悩ませていました。

ということで、シェルスクリプトを書く場合にはスペースに気をつけないといけないという良い勉強になりました。

今後は気をつけていこうと思いここに書きました。

ついでに各コードの説明を記述しておきます。

#!/bin/sh

シェルスクリプトを書くための約束事

read -p "input a or d : " input

キーボードからの入力を変数「input」に格納

if [ "${input}" = "a" ]; then
echo input a OK
elif [ "$input" = "s" ]; then
echo input s OK
else
echo input other key
fi

if, else if, elseを用いた条件式

条件式の「=」は文字列の比較で一致していたら「真」です

inputの前についている「$」は変数の中身を参照するという意味です

シェルスクリプトは1つの命令の区切りが改行になるため、

通常「then」はif文の条件式の次の行に記述しますが、

「;」で区切りを表すことが出来るため、以下のように

if文とthenを一行で記述しています。

自分の備忘録的な内容なので、簡単な説明だけですが以上です。