Skip to content

Instantly share code, notes, and snippets.

@261shimizu
Last active April 18, 2017 04:10
Show Gist options
  • Save 261shimizu/87de1cb56e4d17ff323d26ac8dff1308 to your computer and use it in GitHub Desktop.
Save 261shimizu/87de1cb56e4d17ff323d26ac8dff1308 to your computer and use it in GitHub Desktop.
シェル・シェルスクリプト周りの話

シェル・シェルスクリプト

シェル

  • カーネルはコマンドを理解できない
  • シェルがコマンドをカーネルが理解できる形に翻訳してカーネルに伝える
  • カーネルを包む殻という意味でのシェル(shell)
  • クリックやタッチ、コマンドラインなどもシェルが動いているということ
  • UNIX系のOSでは、機能や使い勝手の異なる複数のシェルが存在し、選べる形になっている(ex:bash)

シェルスクリプト

  • スクリプトとは、プログラムの一種で、機械語翻訳と実行可能ファイル作成等の過程を省略または自動化してコードを記述したらすぐに実行できるものをいう。
  • シェルスクリプトも、スクリプト言語のひとつであり、コマンドを記述するとすぐに実行可能
  • シェルスクリプトは条件分岐や繰り返しなどの制御機構に対応している

シェルスクリプトの実行

  • テキストで記述(vi等)
  • 1行目には、利用するシェルの種類とそのシェルのパスを記述(#でコメントアウトしておく)
  • シェルスクリプトを実行するためには、そのスクリプトのファイル名をコマンドとして打つ(ex: $ ./example.sh)←パスを記述すること
  • または、shコマンド(ex: sh ./example.sh)
  • shコマンドのオプションは、-xで、これはデバッグ機能をつけて実行できるオプション

シェル変数と環境変数

  • シェル変数は現在のシェル(シェルスクリプト)のみで有効
  • 環境変数は子のシェル(シェルスクリプト)からも有効
  • 大きな違いは有効範囲
  • 正確な表現ではないが、イメージとしてはシェル変数→ローカル変数、環境変数→フィールド変数
  • つまり、子の環境変数は親では有効でない

変数

  • サンプルを見た方がわかりやすい
$ abc=123
(変数abcに123を代入。=の前後はくっつける)
$ echo abc
(abcを出力)
    abc
$ echo $abc
(変数abcを出力)
    123
$ abc[0]=100
$ abc[1]=200
$ abc[2]=300
$ echo ${abc[0]}
    100
(一次元配列も扱える、配列の場合は{}をつける)
$ echo ${abc[@]}
    100 200 300
(インデックスを@にするとスペース区切りで全要素出力)

シェル・環境変数周りのコマンド(参考)

  • export 変数名(=値)
    • シェル変数を環境変数にしたり(変数名のところにシェル変数を指定する)、環境変数を新しく作ったりする(変数名に新しいものを指定し、値を代入)
    • 環境変数にする(親→子)
  • env
    • 環境変数の一覧を出力
  • set シェル変数名=値
    • シェル変数の一覧出力
  • read シェル変数名
    • このコマンドを実行すると、標準入力を待つ状態になる。キーボードを打って入力すると、その入力値が変数に代入される。
    • イメージとしては、シェル変数名=br.readLine()
  • unset 変数名
    • 既存のシェル・環境変数を削除
  • source ファイル名
    • ファイルを読み込んでシェル環境を設定する
    • 子の環境変数を親でも適用する(子→親)
    • bashrc等の設定ファイルを書き換えたとき、再起動せずに設定変更を適用する時に使うことが多い

シングルクオート、ダブルクオート、バッククオート、エスケープシーケンス

  • シングルクオート

    • ダブルクオートで囲ったものは文字列として扱われる(変数も、$をつけても文字列となる)
  • ダブルクオート

    • シングルクオートで囲うと、$付きの変数を認識して変数の中身を表せる(変数以外は文字列)
  • バッククオート

    • バッククオート内のものはコマンドが考慮される 例

$ abc=123
$ echo '$abc'
    $abc
$ echo "$abc"
    123
$ abc=\`ls`
(lsした結果が配列(?)としてabcに代入されている)
$ echo $abc
    ダウンロード テンプレート デスクトップ・・・・

  • エスケープシーケンス
    • \がエスケープシーケンス
    • 改行にも有効(改行の前に\を入れるとと改行が無視される)

引数

  • シェルスクリプトは実行時に引数を渡せる
  • 引数は$1,$2,$3,・・・・と表せる(1始まり)
  • $0は、実行コマンド名を表す
  • $#は、引数の数を表す
  • イメージとしては、javaでいうメインメソッドのコマンドライン引数
  • shiftコマンドを使うと、引数が1つ前へ(shift前の$2の中身はshift後の$1の中身になる)ずれる(1番目の引数が消える)
$ cat args.sh
\#!bin/bash

echo '$1:' $1
echo '$2:' $2
shift
echo '$2:' $2
echo '$#:' $#
$ ./args.sh aaa bbb ccc

$1: aaa
$2: bbb
$3: bbb
$#: 2
(シフト以降でずれている)

シェルスクリプト

条件分岐

  1. if文

  2. case文

    • if文

      • if 条件式1 ; then ... elif 条件式2 ; then ... else ... fi

      • elif...とelse...の部分は省略可能

      • elseは、全ての条件に当てはまらなかった場合に実行される

      • 以下条件式によく使われる演算子

      • 文字列比較

        • ==,!=
      • 数値比較

        • -eq(equal)

        • -ne(not equal)

        • -ge(grater equal) 以上

        • -le(less equal) 以下

        • -gt(grater than) より大きい

        • -lt(less than) 未満

        • ex) a -ge b → aがb以上(a>=b)ならば真

      • testコマンド

        • これもよく条件式に使われる
        • test 条件式 → 条件式を評価して真か偽を返す
        • if test -d パス ; then .... →こうすることで、testコマンドの結果が真ならばthen節が実行される
        • testコマンドは[]を使って記述することもできる
          • if [ 条件節 ] ; then .... ← 条件節の前後はスペース必須
        • ここで使う演算子は、-f,-d,-e,-L,-r,-w,-x,-s
          • 順に、通常ファイルなら真、ディレクトリなら真、ファイルが存在すれば真、シンボリックリンクなら真、読み取り可能なら真、書き込み可能なら真、ファイルが存在し実行権限があれば真、サイズが0より大きければ真
      • 複数条件を重ねる

        • 理論積

          • [ 条件A -a 条件B -a 条件C ]
          • [ 条件A ] && [ 条件B ] && [ 条件C ]
        • 論理和

          • [ 条件A -o 条件B -o 条件C ]
          • [ 条件A ] || [ 条件B ] || [ 条件C ]
    • case文

         case 変数 in 
                値A)
                        処理1;;
                値B)
                        処理2;;
         esac
  • 変数の値がAの時、処理1が実行される。値はA|Cなど、パイプ(|)で区切って複数指定できる
繰り返し
  1. for文
  2. while/until文
  3. select文

for文
  • 値を列挙し、それを対象に処理を繰り返す
    for 変数 in 値のリスト
    do 
            処理
    done

# ex)
   $ for i in a b c d
   > do
   >  echo $i
   > done
   a
   b
   c
   d
   $

# ex2)
   $ for i in `ls`
   > do
   >  echo $i
   > done
   ダウンロード
   テンプレート
   ・・・


while/Until文
  • whileは、条件式が真の間処理を繰り返す

  • Untilは、条件式が偽の間処理を繰り返す

  • exprコマンド(整数に対して計算処理を行うコマンド)と組み合わせるとよいかも

  • expr 数式

    1. +-*/%()<=>=や、=、!=、>、<、式1&(かつ)式2、式1|(または)式2と、基本的なものはすべて使える
      • ただし、*,(,),<,>,&,|の前にはバックスラッシュ(エスケープ)が必要
      • 付け加えて、評価(真偽を返すもの)は、真が1、偽が0で返ってくる
#style
while 条件式
do
    処理
done
until 条件式
do
    処理
done


ex)
$ cat loop.sh
#!/bin/bash

count=1
while [ $count -le 10 ]
do
    echo "この処理は$count回実行されました"
    count='expr  $count + 1'
done

select文
  • ユーザーに対して数値による入力を促すコマンド
#style)
select 変数 in リスト
do
    処理
done

#ex)
select name in "apple" "banana" "orange"
do
    echo "You selected $name"
done

#result)
1)apple
2)banana
3)orange
$? 1
You selected apple
(Ctrl+Cで中止)

↑ 1-3を入力すると、do-doneの中の処理が実行される

繰り返しの制御
  • breakcontinueを用いることで繰り返しを制御できる(この二つの意味はJAVAと同じ)
#ex)

$ cat ./sample.sh
while true
do
    echo "Continue? (Y/N)"
    read input
    case $input in
        n) break;;
        y) continue;;
        *) echo "Please input Y or N.";;
    esac
done
関数(サブルーチン)
  • 関数は、引数と呼ばれるデータを与ると、処理をして結果を返してくれる機能の集まり。
#style)

function 関数名
{
    処理
    return 変数名
}

関数名()
{
    処理
    return 変数名
}

↑2つとも働きは同じ。引数は、実行時に関数名に続けて記述する。関数の内部では、引数は順に$1,$2,$3,$4...として取り出せる returnがあれば、変数名の部分を返して、関数内の処理は終了する

実際のシェルスクリプト
  • 実際には、起動時に動くシェルスクリプトなどがある
  • これを起動スクリプトと呼び、/etc/rcなどが該当する
  • /etc/rcの中で、. /etc/init.d/functionsという記述があり、このファイルを読み込んでいる
  • /etc/init.d/functionsには、/etc/にあるスクリプトが共通で使える関数が入っているファイル
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment