「シェルスクリプトの基礎 - コマンドライン引数」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…
 
(同じ利用者による、間の3版が非表示)
24行目: 24行目:
|-
|-
| $1 - $n || シェルスクリプト実行時に指定した各パラメータの値が設定される変数である。<br>1番目に指定した引数は$1、2番目に指定した引数は$2、n番目に指定した引数は$nに設定される。<br>10番目以降の引数参照時は${10}のように{}を使用する必要がある。<br>これは、$10を$1 "0"のように、シェルに誤った解釈をされることを防ぐためである。
| $1 - $n || シェルスクリプト実行時に指定した各パラメータの値が設定される変数である。<br>1番目に指定した引数は$1、2番目に指定した引数は$2、n番目に指定した引数は$nに設定される。<br>10番目以降の引数参照時は${10}のように{}を使用する必要がある。<br>これは、$10を$1 "0"のように、シェルに誤った解釈をされることを防ぐためである。
|-
| $? || 直前に実行されたコマンドの終了ステータスが設定される変数。<br>シェルスクリプトでは、<code>exit</code>コマンドに与えた引数が終了ステータスとなる。<br>例えば、<code>exit 2</code>と記述する場合、そのシェルスクリプトの終了ステータスは2となる。<br>また、関数の<code>return</code>の場合も同様に、指定した引数がその関数の終了ステータスとなる。
|-
| $! || バックグラウンドで実行されたコマンドのプロセスIDが設定される変数。<br><code>sleep 100 &</code>のように<code>&</code>を付加してバックグラウンドで実行する時、<br>特殊変数$!には、sleepコマンドのPID(プロセスID)がセットされる。
|-
| $- || setコマンドで設定されたフラグまたはシェルの起動時に指定されたフラグの一覧が設定される変数。
|-
| $$ || コマンド自身のPID(プロセスID)が設定される変数。<br><br>例えば、シェルスクリプト内で作成するファイル名に変数$$を指定するというものがある。<br>例 : tempfile_$$.txt<br><br>同一シェルスクリプトを同時実行する場合、シェルスクリプト実行ごとに作成するファイル名を変更できるため、<br>各シェルスクリプトが同時に同一ファイルに出力することを防止できる。
|-
| $LINENO || この変数を使用している行の行番号が設定される変数。
|-
| ${PIPESTATUS[@]} || パイプで連結した各コマンドの終了ステータスが設定される配列。<br>この変数を使用することで、パイプの先頭や途中にあるコマンドの終了ステータスを参照することができる。<br><u>ただし、bashのみ使用できる。</u>
|}
|}
</center>
</center>
273行目: 261行目:
Pattern 4の方法は、$*と指定した場合は、Pattern 2と同様に、全ての要素がスペース区切りで渡されたとみなされる。(4つの要素として処理される)<br>
Pattern 4の方法は、$*と指定した場合は、Pattern 2と同様に、全ての要素がスペース区切りで渡されたとみなされる。(4つの要素として処理される)<br>
  for arg in 100 200 AAA BBB; ...
  for arg in 100 200 AAA BBB; ...
<br><br>
== ラッパー ==
シェルスクリプトの実行時の引数を、そのまま別のコマンドに渡す場合、<code>"$@"</code>を使用する。<br>
このような用途で記述されているシェルスクリプトのことをラッパーと呼ぶ。<br>
<syntaxhighlight lang="sh">
#!/bin/sh
./do_command.sh "$@"
</syntaxhighlight>
<br><br>
<br><br>


303行目: 301行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
== コマンドライン引数の解析 : getopts ==
複雑なコマンドライン引数の指定する場合、全てのコマンドライン引数の妥当性の確認等、解析にはかなりの労力を要する。<br>
そのため、<code>getopts</code>コマンドを使用することで、コマンドライン引数の解析を容易に行うことができる。<br>
<br>
以下の例のように、コマンドライン引数の解析には、<code>while文</code>と<code>getopts</code>コマンドを組み合わせて使用する。<br>
<code>getopts</code>コマンドの第1引数には、シェルスクリプトに指定可能な引数名を指定して、その引数が値を要する場合は<code>:</code>(コロン)を付加する。<br>
第2引数には、解析に使用する任意の変数名を指定する。あくまでも変数名であるので、<code>$</code>を付ける必要はない。<br>
<br>
以下の例において、xxx.sh -a -b "BBB" -c "CCC"といったコマンドを実行する時、"BBB"および"CCC"等の値は変数<code>OPTARG</code>に代入される。<br>
<syntaxhighlight lang="sh">
#!/usr/bin/env sh
while getopts ab:c: OPT
do
    case $OPT in
      "a" )
          FLG_A="TRUE"
          ;;
      "b" )
          FLG_B="TRUE"
          VALUE_B="$OPTARG"
          ;;
      "c" )
          FLG_C="TRUE"
          VALUE_C="$OPTARG"
          ;;
    esac
done
</syntaxhighlight>
<br>
以下の例では、<code>getopts</code>コマンドを利用したシェルスクリプトを作成している。<br>
<syntaxhighlight lang="sh">
# param_getopts.shファイル
#!/usr/bin/env sh
CMDNAME=`basename $0`
while getopts ab:c: OPT
do
    case $OPT in
      "a" )
          FLG_A="TRUE"
          ;;
      "b" )
          FLG_B="TRUE"
          VALUE_B="$OPTARG"
          ;;
      "c" )
          FLG_C="TRUE"
          VALUE_C="$OPTARG"
          ;;
      * )
          echo "Usage: $CMDNAME [-a] [-b VALUE] [-c VALUE]" 1>&2
          exit 1
          ;;
    esac
done
if [ "$FLG_A" = "TRUE" ]; then
    echo '"-a"オプションが指定されました'
fi
if [ "$FLG_B" = "TRUE" ]; then
    echo '"-b"オプションが指定されました'
    echo "値は$VALUE_Bです"
fi
if [ "$FLG_C" = "TRUE" ]; then
    echo '"-c"オプションが指定されました'
    echo "値は$VALUE_Cです"
fi
exit 0
# 実行
./param_getopts.sh  # 引数の指定が無い場合、何も出力せずに終了する
./param_getopts.sh -a
./param_getopts.sh -a -b "123456"
./param_getopts.sh -ab "123456"  # -abのように複数のオプションをまとめて指定することも可能
./param_getopts.sh -a -b "123456" -c  # -cオプションに値が指定されていないためエラー
./param_getopts.sh -a -b "123456" -c "ABCDEF"
# 出力
"-a"オプションが指定されました
"-a"オプションが指定されました
"-b"オプションが指定されました
値は123456です
"-a"オプションが指定されました
"-b"オプションが指定されました
値は123456です
./param_getopts.sh: option requires an argument -- c
Usage: param_getopts.sh [-a] [-b VALUE] [-c VALUE]
"-a"オプションが指定されました
"-b"オプションが指定されました
値は123456です
"-c"オプションが指定されました
値はABCDEFです
</syntaxhighlight>
<br><br>
== getoptsコマンドとshiftコマンドの組み合わせ ==
複雑なコマンドライン引数の指定が必要なシェルスクリプトの場合、<br>
引数の解析後に不要となった引数に対して、<code>shift</code>コマンドで切り捨てることができる。<br>
<br>
以下の例では、変数<code>OPTIND</code>から1を引いた分だけ<code>shift</code>コマンドを実行することにより、不要になった引数を切り捨てている。<br>
<syntaxhighlight lang="sh">
shift $(expr $OPTIND - 1)
</syntaxhighlight>
<br>
変数<code>OPTIND</code>は、<code>getopts</code>コマンドがオプションを順番に処理するために使用するオプション位置を示すカーソルのような働きをする変数である。<br>
<code>getopts</code>コマンドの終了後は、変数<code>OPTIND</code>の値がオプションの直後を指し示しているため、<br>
この値から1減算した分だけ<code>shift</code>することにより、オプション部分を切り捨てることができる。<br>
<br>
以下の例では、シェルスクリプト内において、getopts abc OPTと記述されている場合、<code>getopts</code>コマンドの終了後の変数<code>OPTIND</code>の値は、<br>
<パラメータ>の位置を指し示している。<br>
その値から1減算して<code>shift</code>するということは、-a -b -cを切り捨てることになる。<br>
xxx.sh -a -b -c "<パラメータ>"
<br>
以下の例では、オプション部分を切り捨てるシェルスクリプトを作成している。<br>
どのようなコマンドライン引数であっても、オプション部分のみが確実に切り捨てていることが確認できる。<br>
<syntaxhighlight lang="sh">
#!/usr/bin/env sh
# -a, -b, -cオプションを指定可能とする
while getopts abc OPT
do
    # ...解析処理は省略
done
# オプション部分を切り捨てる
shift $(expr $OPTIND - 1)
# オプション部分を切り捨てたため、変数$1には先頭の引数が設定されている
echo "引数に\"$1\"が指定されました"
exit 0
# 実行
./param_optind.sh -abc "PARAMETER"
./param_optind.sh -ab "PARAMETER"
./param_optind.sh -ac "PARAMETER"
./param_optind.sh "PARAMETER"
./param_optind.sh -a -b -c "PARAMETER1" "PARAMETER2"
# 出力
引数に"PARAMETER"が指定されました
引数に"PARAMETER"が指定されました
引数に"PARAMETER"が指定されました
引数に"PARAMETER"が指定されました
引数に"PARAMETER1"が指定されました
</syntaxhighlight>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:シェルスクリプト]]
[[カテゴリ:シェルスクリプト]]