bashにgoto文はありません【代替策あり】

シェル/bash

こんにちは。

普段はIT業界についてのブログを執筆してるエンジニアです。
» 参考:プログラマーの年収は200万円以下です【IT業界の残酷な成功法則】
» 参考:【一生使える本です】bashの解説書 厳選3選【おすすめ】

今回はbashの使い方の解説です。

bashでgoto文を使いたい人

bashでgoto文を使いたい人
「bashを使ってシェルスクリプティングをしてますが、basicのようなgoto文を使いたいです。goto文かそれに相当するコードを書くことはできますか?」

goto文はプログラムの流れを複雑化するため、現在ではほとんど使われていません。実際bashにも、goto文に相当する機能はありません。

本記事の内容

  • goto文を使ってbashでやりたい事
  • 代替策1:関数にする
  • 代替策2:gotoで飛ばしたい処理を飛ばさずに書く
  • 代替策3:while文を使う
  • 代替策4:csh(tcsh)を使う
  • gotoに相当するコマンドは無い
  • ジョブ運用でgotoを使いたい場合

goto文を使ってbashでやりたい事

goto文で実現したいのは、おそらくこんな使い方。引数が無ければエラーにするプログラムの例です。しかしbashにはgoto文がないので、以下のコードは実際には正しく動きません

#!/bin/bash
if [ "$1" = "" ]
then
 goto Label_Error 
else
 goto Label_Standard
fi


Label_Standard:
  echo "OK"
  exit 0

Label_Error:
  echo "Error"
  exit 1

代替策1:関数にする

Labelに相当する部分の処理を丸ごと関数にしてしまいます。これならbashで動きます。

#!/bin/bash
function Label_Standard() {
  echo "OK"
  return 0
}

function Label_Error() {
  echo "Error"
  return 1
}

if [ "$1" = "" ]
then
 Label_Error 
else
 Label_Standard
fi

代替策2:gotoで飛ばしたい処理を飛ばさずに書く

gotoに飛ばさず、その場に書いてしまいます方法です。

#!/bin/bash
if [ "$1" = "" ]
then
{
  echo "Error"
  exit 1
}
else
  {
  echo "OK"
  exit 0
 } 
fi

代替策3:while文を使う

より複雑な処理を行いたい場合、goto文の代替策として有効なのはwhile文です。ある条件の間処理を行い、breakしたら後続処理を行うことができます。

このように、gotoは可読性が悪いためwhile文や関数によって置き換えるのが一般的で、プログラムの変更が比較的容易なためbashだけでなく現在使われている言語はほとんどgoto文の機能はありません。

代替策4:csh(tcsh)を使う

bashの代わりにcsh(tcsh)を使えばgoto文を使うことができます。

gotoに相当するコマンドは無い

bashの純粋な機能として無いのなら、Linuxコマンドでgotoの直接代替となるものは無いかと考えネットで調査しましたが、ありませんでした。

gotoと名のつく機能はいくつかありますが、いずれもディレクトリのエイリアスを持つ機能で、basicのようなgoto文に相当する代替機能は無いようです。

さらに別の代替策:ジョブ運用でgotoを使う

さらに別の代替策:ジョブ運用でgotoを使う

問題解決を少し広くとらえます。

bashで開発する処理をジョブ運用して使うのなら、ジョブ側の機能でgotoを実現できるかもしれません。
例えば、ジョブ運用ツールのJP1にはgoto文を利用できます。

JP1 Version 11 JP1/Script 解説・文法書 >
7. ステートメント > 7.1 ステートメント一覧 > 7.1.12 GoTo

[機能]
指定したラベルに無条件に分岐するステートメントです。

[形式]
GoTo LabelName

[指定項目]
LabelName
分岐先のラベル名を指定します。ラベル名には変数の名前付け規則に準じた名前を指定します。

[説明]
指定されたラベル先に実行の制御を移し,ラベルの次の行から実行が再開されます。ラベル名にスクリプトレベルまたはプロシージャレベルで同じ名前が複数個指定されている場合,文法エラーになります。

分岐先のラベルは任意の位置に記述できますが,GoToステートメントがプロシージャの内部で指定されている場合,分岐先は同じプロシージャの内部に存在しなければなりません。

分岐先のラベルを次のように指定した場合,実行エラーになります。

GoToステートメントをプロシージャの外部で指定し,分岐先のラベルをプロシージャの内部に指定する。

GoToステートメントをフロー制御ステートメントの外部で指定し,分岐先のラベルをフロー制御ステートメントの内部に指定する。

出典:JP1 Version 11 JP1/Script 解説・文法書 

またジョブ設計の場合、ジョブからジョブへの連携はかなり柔軟に設定できますので、goto的な処理ができると言えるかもしれませんね。

今回は以上です。お役に立ちましたら幸いです。


Blog TOP  シェルスクリプトを勉強したい人向け|bashの使い方 記事まとめ

bashの使い方 - もくじ

bashの使い方 - もくじ

シェルとは

 - シェルとは
 - シェルはOSと会話するための言語
 - シェルの種類(bash以外のシェル)
 - シェルスクリプトとは
 - シェルスクリプトの書き方

条件式

 - if else文
 - 文字列の比較
 - &&と||の使い方
 - case文

文字列操作

 - 文字列の連結
 - 文字列の一部を切り出す

繰り返し

 - for文
 - while文
 - while文でリストから1つ要素ずつ処理する

定数

 - 定数の定義

関数

 - 関数の定義

デバッグ

 - デバッグオプション(-x)

実行権限

 - 実行権限のないシェルスクリプトファイルを実行する

 - シェルスクリプトの書籍3選