bashにgoto文はありません【代替策あり】
こんにちは。
普段はIT業界についてのブログを執筆してるエンジニアです。
» 参考:プログラマーの年収は200万円以下です【IT業界の残酷な成功法則】
» 参考:【一生使える本です】bashの解説書 厳選3選【おすすめ】
今回はbashの使い方の解説です。
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したら後続処理を行うことができます。
【bash】while文の使い方を解説します【無限ループの使い方】
bashのwhileループについて調べる人「bashでwhile文を使用した無限ループを実装したい。コピペできるソースコード例も欲しいです」→こんな悩みを解決します。
1.whileによる無限ループ
2.whileループをbreakで抜ける
このように、gotoは可読性が悪いためwhile文や関数によって置き換えるのが一般的で、プログラムの変更が比較的容易なためbashだけでなく現在使われている言語はほとんどgoto文の機能はありません。
代替策4:csh(tcsh)を使う
bashの代わりにcsh(tcsh)を使えばgoto文を使うことができます。
gotoに相当するコマンドは無い
bashの純粋な機能として無いのなら、Linuxコマンドでgotoの直接代替となるものは無いかと考えネットで調査しましたが、ありませんでした。
gotoと名のつく機能はいくつかありますが、いずれもディレクトリのエイリアスを持つ機能で、basicのような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の使い方 - もくじ
シェルとは
- シェルとは
- シェルはOSと会話するための言語
- シェルの種類(bash以外のシェル)
- シェルスクリプトとは
- シェルスクリプトの書き方条件式
- if else文
- 文字列の比較
- &&と||の使い方
- case文文字列操作
- 文字列の連結
- 文字列の一部を切り出す繰り返し
- for文
- while文
- while文でリストから1つ要素ずつ処理する定数
- 定数の定義
関数
- 関数の定義
デバッグ
実行権限
本
「今の会社を辞めて転職します。エンジニア職に強みのあるおすすめの転職サイト・転職エージェントを教えて欲しい。また好条件で転職するにはどうすれば良いですか?」こんな悩みに答えます。 ITエンジニアに強いおすすめの転職サイト・転職エージェント3選 転職成功には強くてニューゲームが条件。どうやって実現する?