「シェルスクリプトの基礎 - 変数」の版間の差分

ナビゲーションに移動 検索に移動
文字列「<source lang」を「<syntaxhighlight lang」に置換
(文字列「</source>」を「</syntaxhighlight>」に置換)
(文字列「<source lang」を「<syntaxhighlight lang」に置換)
5行目: 5行目:
== 変数の定義と参照 ==
== 変数の定義と参照 ==
変数へ値を代入する時は$を付けず、変数を参照するときは$を付ける。<br>
変数へ値を代入する時は$を付けず、変数を参照するときは$を付ける。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
20行目: 20行目:
<br>
<br>
未定義の変数を参照すると、空文字列と同様に扱われる。(エラーにはならない)<br>
未定義の変数を参照すると、空文字列と同様に扱われる。(エラーにはならない)<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
38行目: 38行目:
以下の例では、(1)環境変数LANGの0文字目から5文字分のみ取得、(2).(ドット)文字までを削除、(3).(ドット)文字以降を削除を行っている。<br>
以下の例では、(1)環境変数LANGの0文字目から5文字分のみ取得、(2).(ドット)文字までを削除、(3).(ドット)文字以降を削除を行っている。<br>
なお、操作を指定せず${変数名}とする場合、$変数名と同義になる。<br>
なお、操作を指定せず${変数名}とする場合、$変数名と同義になる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #! /bin/bash
  #! /bin/bash
   
   
76行目: 76行目:
== 定数 ==
== 定数 ==
以下のように実行すると、指定した変数や関数に対する代入、<code>unset</code>ができなくなる。<br>
以下のように実行すると、指定した変数や関数に対する代入、<code>unset</code>ができなくなる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  readonly var      # 変数varをreadonlyにする
  readonly var      # 変数varをreadonlyにする
  readonly -a arr  # 配列arrをreadonlyにする
  readonly -a arr  # 配列arrをreadonlyにする
83行目: 83行目:
<br>
<br>
以下のように、変数の定義と同時にreadonlyを指定することも可能である。<br>
以下のように、変数の定義と同時にreadonlyを指定することも可能である。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  readonly USERNAME="Mike"
  readonly USERNAME="Mike"
  </syntaxhighlight>
  </syntaxhighlight>
89行目: 89行目:
以下の例では、変数MAX_SIZEを100で初期化した後、200という値を代入しようとしている。<br>
以下の例では、変数MAX_SIZEを100で初期化した後、200という値を代入しようとしている。<br>
変数MAX_SIZEは定数化されているので、代入しようとした場合はエラーになる。<br>
変数MAX_SIZEは定数化されているので、代入しようとした場合はエラーになる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
112行目: 112行目:
==== 変数に値が代入されていることを確認する ====
==== 変数に値が代入されていることを確認する ====
以下の例では、変数NAMEの値がセットされているか調べている。<br>
以下の例では、変数NAMEの値がセットされているか調べている。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
122行目: 122行目:
==== 変数に値が代入されていないことを確認する ====
==== 変数に値が代入されていないことを確認する ====
以下の例では、変数NAMEの値がセットされていないか調べている。<br>
以下の例では、変数NAMEの値がセットされていないか調べている。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
137行目: 137行目:
==== 加算 / 減算 ====
==== 加算 / 減算 ====
変数の値に対して、加算および減算を行うには以下のように記述する。<br>
変数の値に対して、加算および減算を行うには以下のように記述する。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
145行目: 145行目:
  </syntaxhighlight>
  </syntaxhighlight>
または
または
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
156行目: 156行目:
  300
  300
<br>
<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #! /bin/bash
  #! /bin/bash
   
   
178行目: 178行目:
実数を演算では、bcコマンドを使用する。<br>
実数を演算では、bcコマンドを使用する。<br>
また、bcコマンドも制御構文を使用したスクリプト処理が可能である。<br>
また、bcコマンドも制御構文を使用したスクリプト処理が可能である。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #! /bin/bash
  #! /bin/bash
   
   
245行目: 245行目:
==== ランダムな数値の取得 ====
==== ランダムな数値の取得 ====
Bashのシェル変数$RANDOMを参照すると、0~32767の範囲のランダムな整数を取得することができる。<br>
Bashのシェル変数$RANDOMを参照すると、0~32767の範囲のランダムな整数を取得することができる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
257行目: 257行目:
== 文字列の連結 ==
== 文字列の連結 ==
複数の変数を連結するには、以下のように続けて記述する。<br>
複数の変数を連結するには、以下のように続けて記述する。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
269行目: 269行目:
<br>
<br>
また、以下のように変数を{}で括る。<br>
また、以下のように変数を{}で括る。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
299行目: 299行目:
<br>
<br>
以下の例では、lsコマンドの実行結果を変数FILESに代入して、echoで出力している。<br>
以下の例では、lsコマンドの実行結果を変数FILESに代入して、echoで出力している。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
306行目: 306行目:
  </syntaxhighlight>
  </syntaxhighlight>
または<br>
または<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/sh
  #!/bin/sh
   
   
404行目: 404行目:
<br>
<br>
* 最初に一致する文字列のみ置換する。
* 最初に一致する文字列のみ置換する。
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  X=aaabbbccc
  X=aaabbbccc
415行目: 415行目:
<br>
<br>
* パターンに一致する文字列を全て置換する。
* パターンに一致する文字列を全て置換する。
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  X=aaabbbccc
  X=aaabbbccc
426行目: 426行目:
<br>
<br>
sedコマンドと同様の結果を、シェルスクリプトの機能だけで実現できていることがわかる。<br>
sedコマンドと同様の結果を、シェルスクリプトの機能だけで実現できていることがわかる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  X=aaabbbccc
  X=aaabbbccc
  Y=$(echo $X | sed -e 's/bbb/BBB/g')
  Y=$(echo $X | sed -e 's/bbb/BBB/g')
434行目: 434行目:
*: 以下の例では、/aaa/bbb/cccという絶対パスから、basenameのcccを抽出している。
*: 以下の例では、/aaa/bbb/cccという絶対パスから、basenameのcccを抽出している。
*: */というパターンで、先頭から最長一致させて、/aaa/bbb/を取り除いている。
*: */というパターンで、先頭から最長一致させて、/aaa/bbb/を取り除いている。
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  X=/aaa/bbb/ccc
  X=/aaa/bbb/ccc
445行目: 445行目:
<br>
<br>
また、basenameを取得する場合、一般的に、basenameコマンドを使用した方が簡単である。<br>
また、basenameを取得する場合、一般的に、basenameコマンドを使用した方が簡単である。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  basename $X
  basename $X
  </syntaxhighlight>
  </syntaxhighlight>
452行目: 452行目:
*: 以下の例では、/aaa/bbb/cccという絶対パスから、ディレクトリ名の/aaa/bbbを抽出している。
*: 以下の例では、/aaa/bbb/cccという絶対パスから、ディレクトリ名の/aaa/bbbを抽出している。
*: /*というパターンで、末尾から最短一致させて、/cccを取り除いている。
*: /*というパターンで、末尾から最短一致させて、/cccを取り除いている。
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  X=/aaa/bbb/ccc
  X=/aaa/bbb/ccc
463行目: 463行目:
<br>
<br>
また、ディレクトリ名を取得する場合、一般的に、dirnameコマンドを使用した方が簡単である。<br>
また、ディレクトリ名を取得する場合、一般的に、dirnameコマンドを使用した方が簡単である。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  dirname $X
  dirname $X
  </syntaxhighlight>
  </syntaxhighlight>
469行目: 469行目:
* '#'以降のコメントを削除する。
* '#'以降のコメントを削除する。
*: #*というパターンで、末尾から最長一致させて、変数LINEの#以降の部分を削除している。
*: #*というパターンで、末尾から最長一致させて、変数LINEの#以降の部分を削除している。
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  LINE="aaa bbb # This is a comment"
  LINE="aaa bbb # This is a comment"
507行目: 507行目:
* ${変数:?word}
* ${変数:?word}
*: 例えば、以下のように記述すると、変数COUNTの値が無ければエラーを出力して終了する。
*: 例えば、以下のように記述すると、変数COUNTの値が無ければエラーを出力して終了する。
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  echo ${COUNT:?}
  echo ${COUNT:?}
516行目: 516行目:
<br>
<br>
?の後ろに表示するメッセージを指定することもできる。<br>
?の後ろに表示するメッセージを指定することもできる。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  echo ${COUNT:?パラメータが設定されていません}
  echo ${COUNT:?パラメータが設定されていません}
527行目: 527行目:
*: 変数に値が代入されている場合、代わりにwordの値を返す。
*: 変数に値が代入されている場合、代わりにwordの値を返す。
*: 例えば、${COUNT:+1}は、変数COUNTが定義されていたら1と評価される。
*: 例えば、${COUNT:+1}は、変数COUNTが定義されていたら1と評価される。
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  COUNT=9999
  COUNT=9999
536行目: 536行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  COUNT=9999
  COUNT=9999
558行目: 558行目:
</center>
</center>
<br>
<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  HOGE=ABCDEFGHIJ
  HOGE=ABCDEFGHIJ
567行目: 567行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  HOGE=ABCDEFGHIJ
  HOGE=ABCDEFGHIJ
578行目: 578行目:
offsetやlength に負の値を指定して、末尾から文字列を抽出することもできる。<br>
offsetやlength に負の値を指定して、末尾から文字列を抽出することもできる。<br>
ただし、offsetの前に1つ以上のスペースが必要である。(スペースを入れないと、${変数:-word}という形で初期値が指定されたとみなされる)<br>
ただし、offsetの前に1つ以上のスペースが必要である。(スペースを入れないと、${変数:-word}という形で初期値が指定されたとみなされる)<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  # 実行
  # 実行
  HOGE=ABCDEFGHIJ
  HOGE=ABCDEFGHIJ
587行目: 587行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
  <source lang="sh>
  <syntaxhighlight lang="sh>
  # 実行
  # 実行
  HOGE=ABCDEFGHIJ
  HOGE=ABCDEFGHIJ

案内メニュー