11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

シェルのif文でハマった話

Last updated at Posted at 2019-06-14

作成したコード

ターミナルから意地でも離れないマンなので、ターミナル上からbitbucketを一発で開きたい…!
という思いで作成したコマンド。

bit [リポジトリ名] //指定したリポジトリのページを開く (e.g.)bit hoge 

まず成功例

.zshrc
alias bit="open_bitbucket"

function open_bitbucket() {
    sh open_bitbucket.sh $1
}
open_bitbucket.sh
#!/bin/bash

if [ "$1" = "hoge-repository" ]; then
    open "hoge-repositoryへのURL"
elif [ "$1" = "fuga-repository" ]; then
    open "fuga-repositoryへのURL"
fi

【失敗例1】 [hoge: command not found

これはシェルを全く知らない僕がまず初めに詰んだポイントです。
↓のように書くとこのエラーが発生します。

open_bitbucket.sh
#!/bin/bash

if ["$1" = "hoge-repository"]; then
    open "hoge-repositoryへのURL"
elif ["$1" = "fuga-repository"]; then
    open "fuga-repositoryへのURL"
fi

原因はカッコ[]の中にスペースが含まれていないことでした。
シェルでの[]は条件を判定するtestコマンドの別の書き方で、if文に限らず条件式を[]で書くときはカッコ内の前後にスペースを入れる必要があります。

open_bitbucket.sh
#!/bin/bash

if ["$1" = "hoge-repository"]; then #こうじゃなく
if [ "$1" = "hoge-repository" ]; then #こう

【失敗例2】 [: hoge: integer expression expected

これは、失敗例1で悩みながら色々調べてコードを変更した末にたどり着いた第2のハマりポイントでした。
コードは以下の通りです。

open_bitbucket.sh
#!/bin/bash

if [ "$1" -eq "hoge-repository" ]; then
    open "hoge-repositoryへのURL"
elif [ "$1" -eq "fuga-repository" ]; then
    open "fuga-repositoryへのURL"
fi

-eqという演算子を使っていることが原因っぽかったです。
ど初心者なのでこんなことも知らなくて恥ずかしいのですが、-eqは数値の比較にしか使えないみたいですね…
[参考]http://itdoc.hitachi.co.jp/manuals/3020/30203S3530/JPAS0134.HTM
ということで、下記のように修正します。

open_bitbucket.sh
#!/bin/bash

if [ "$1" -eq "hoge-repository" ]; then #こうじゃなく
if [ "$1" = "hoge-repository" ]; then #こう

まとめ

シェルの文法は独特で慣れるまで大変そうですが、Vimmerの私としてはぜひとも慣れておきたいなと思いました。
頑張って勉強します。

11
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
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?