モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

シェルスクリプトにおける関数定義

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2013/08/05
最終更新最終更新
2018/10/07
記事区分記事区分
一般公開

目次

    GitHub Actions とか CI/CD が好きです。

    0
    ステッカーを贈るとは?

    シェル関数は複数のコマンドをひとまとめにしたものです。引数の取得では、シェルスクリプトの引数と同じ名称の特殊変数を使用します。また、独自のローカル変数を用意することができないため、関数外で使用されている変数の内容を書き換えてしまう危険性があります。

    シェル関数は複数のコマンドをまとめたもの

    sample.sh

    #!/bin/sh
    
    echo1(){
        echo 1
    }
    echo1
    

    実行例

    $ sh sample.sh
    1
    

    一行でまとめるためには、セミコロンが必要です。

    sample.sh

    #!/bin/sh
    
    echo1(){ echo 1; }
    echo1
    

    実行例

    $ sh sample.sh
    1
    

    関数のためのローカル変数は用意不可

    シェルスクリプトでは、関数のためのローカル変数が用意できません。関数内で変数を使用するときは注意しましょう。

    sample.sh

    #!/bin/sh
    
    VAR=128
    func(){
        VAR=256
    }
    func
    echo $VAR
    

    実行例

    $ sh sample.sh
    256
    

    関数の引数

    $# によって、シェルスクリプトの引数と全く同じ名称の特殊変数で関数の引数を取得できます。UNIXによっては、関数呼び出し時にシェルスクリプトの引数が格納されていた $1, $2 ,...の内容を上書きしてしまうため、事前に他の変数に保存しておくなどの工夫が必要です。

    sample.sh

    #!/bin/sh
    
    func(){
        echo $#
        echo $1
    }
    func 128 dummy dummy
    

    実行例

    $ sh sample.sh
    3
    128
    

    関数の返り値

    直前に実行したコマンドの終了ステータスが格納される特殊変数を利用して関数からの返り値を取得します。

    sample.sh

    #!/bin/sh
    
    func(){
        return 8
    }
    func
    
    echo $?
    

    実行例

    $ sh sample.sh
    8
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    GitHub Actions とか CI/CD が好きです。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • UNIX リダイレクションについて
        「下記ファイルディスクリプタがプロセスと結びつける対象ファイル」を別のファイルに変更することをリダイレクションとよびます。実際には、ファイルディスクリプタ1と2の対象ファイルの変更を指すことが多いです。 ファイルディスクリプタとは? ファイルディスクリプタは「プロセス」と「プロセスが使用するファイル」を結びつけるもので、それらには0,1,2,...と連続した番号が割り当てられています。ファイルディ...
      • シェルスクリプトにおける数値計算
        シェル変数はすべて文字列扱いであるため、数値計算のためには専用のコマンドを用いる必要があります。 整数同士の計算 整数同士の四則演算にはexprコマンドを使用します。 sample.sh #!/bin/sh expr 1 + 1 expr 1 - 1 expr 1 '*' 1 # ワイルドカードと区別するために、クォーテーションで囲う必要があります expr 1 / 1 expr 1 % 1 実行...
      • egrepとgrepの違い
        grepは 'g'lobal 'r'egular 'e'xpression 'p'rint つまり、全体から正規表現で一致したものを抽出するためのコマンドです。egrepは 'e'xtended grep つまりgrepの機能拡張版です。拡張正規表現とよばれる式が使用できるため、grepと比較して高度な抽出が可能になります。とはいえ、grepに'-E'オプションを付与して実行するとegrepとほぼ...
      • シェルスクリプトでシグナルをキャッチする
        無限ループに陥ってしまったプロセスを強制終了させるためにはCtrl-Cやkillコマンドを利用します。このとき、プロセスにはシグナルというものが送られています。プロセスはシグナルの種類に応じて既定された処理を実行します。trapコマンドを用いると、各シグナル番号に対応する既定の処理を書き換えることができます。 trapコマンド シグナルN1, N2, N3, ...を受けたときに実行するコマンドを...
      • シェルスクリプトにおける反復処理
        for sample.sh #!/bin/sh for i in a b c; do echo $i done ARR=( "abc" "xyz" ) for e in "${ARR[@]}"; do echo $e done 実行例 $ ./sample.sh a b c abc xyz while sample.sh #!/bin/sh cnt=1 while ...