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

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

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

目次目次を開く/閉じる

シェルスクリプトの変数について

モーダルを閉じる

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

お支払い手続きへ
モーダルを閉じる

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

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

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

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

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

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

作成日作成日
2013/07/26
最終更新最終更新
2022/07/19
記事区分記事区分
一般公開

目次

    Web3関連の開発を行っています。分散型アプリケーションが研究テーマの学生です。

    値のセット/リセット

    VAR=128 # セット
    VAR=    # リセット
    # unset VAR # リセットの別の方法 (変数の消去。unsetは関数の消去もできます)
    

    = の左右に空白が入るとエラーになります。

    sample.sh

    #!/bin/sh
    
    TODAY=`date`
    # TODAY = `date` # エラー
    echo "Date: `date`, $TODAY"
    

    実行例

    $ ./sample.sh 
    Date: Thu Jul 25 23:50:18 JST 2013, Thu Jul 25 23:50:18 JST 2013
    

    プロセスID (PID)

    現在のコマンドのPID (多重起動を防止するサンプル)

    PROG=`basename $0`
    
    if [ $$ != `pgrep -o $PROG` ]
    then
       echo 'Already started.'
       exit 1
    fi
    

    バックグラウンドのPID (応用サンプル)

    sample.sh

    #!/bin/sh
    sleep 3 &
    echo 128
    wait $! # バックグラウンドのPIDが存在する限り待つ
    echo 256
    

    実行例

    $ ./sample.sh
    128  ←すぐに表示
    256  ←3秒後に表示 (それまではwait)
    

    コマンドへの引数 (ARGV、ARGC相当)

    C言語などの、ARGCやARGVに相当する特殊変数です。

    • $#: ARGCに相当。'#'はnumber。
    • $0: 自分自身 (実行中のコマンドファイル) へのパス
    • $1, $2, ...: 第i引数
    • $@: 全引数リスト。"$@" とダブルクォーテーションで囲うと、$1 $2 ... $n とそれぞれの引数を個別にダブルクォーテーションで囲んだものに展開されます。

    sample.sh

    #!/bin/sh
    if [ $# -eq 0 ]; then
        echo "No argument was specified."
        exit 1
    fi
    echo $0 $1 $2
    

    実行例1

    $ ./sample.sh 
    No argument was specified.
    

    実行例2

    $ ./sample.sh arg1 arg2 
    ./sample.sh arg1 arg2
    

    直前のコマンドの終了ステータス

    特殊変数 $? に、直前のコマンドの終了ステータス (正常終了であれば0(真), 異常終了であれば0以外(偽)) が格納されています。シェルスクリプトではC言語などと真偽値の判定基準が逆になっていることに注意しましょう。

    使用しているシェル

    echo $SHELL
    

    終了ステータスが 0 でない場合に停止するスクリプト化 (bash)

    関連して bash の場合は set -e を記述することで、終了ステータスが 0 でない場合に終了させることができます。

    #!/bin/sh
    set -e
    
    echo 123
    mkdir /tmp/xxx
    echo 234
    mkdir /tmp/xxx || true
    echo 345
    mkdir /tmp/xxx
    echo 456
    

    実行例

    $ ./sample.bash
    123
    234
    mkdir: /tmp/xxx: File exists
    345
    mkdir: /tmp/xxx: File exists
    

    パイプで停止するスクリプト

    set -o pipefail を利用します。

    #!/usr/bin/bash
    set -e
    set -o pipefail
    
    false | echo hi
    echo hi
    

    実行例

    $ bash sample.bash 
    hi
    $ echo $?
    1
    

    エラーを trap して処理をするスクリプト

    trapset -o errtrace を利用します。

    #!/usr/bin/bash
    set -e
    set -o errtrace
    
    trap "echo hello" ERR
    false
    echo hi
    

    実行例

    $ bash sample.bash 
    hello
    $ echo $?
    1
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    Web3関連の開発を行っています。分散型アプリケーションが研究テーマの学生です。

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

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

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

    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とほぼ...
      • シェルスクリプトにおける関数定義
        シェル関数は複数のコマンドをひとまとめにしたものです。引数の取得では、シェルスクリプトの引数と同じ名称の特殊変数を使用します。また、独自のローカル変数を用意することができないため、関数外で使用されている変数の内容を書き換えてしまう危険性があります。 シェル関数は複数のコマンドをまとめたもの sample.sh #!/bin/sh echo1(){ echo 1 } echo1 実行例 $ ...
      • シェルスクリプトでシグナルをキャッチする
        無限ループに陥ってしまったプロセスを強制終了させるためにはCtrl-Cやkillコマンドを利用します。このとき、プロセスにはシグナルというものが送られています。プロセスはシグナルの種類に応じて既定された処理を実行します。trapコマンドを用いると、各シグナル番号に対応する既定の処理を書き換えることができます。 trapコマンド シグナルN1, N2, N3, ...を受けたときに実行するコマンドを...