Open4

Shellscript

ピン留めされたアイテム
aiskyaisky

業務で shellscript を書きたくなることが多々あるので、調べたことのメモ

aiskyaisky

Shellscript の基本

参考 URL: 初心者向けシェルスクリプトの基本コマンドの紹介

New Line

改行とセミコロン ; はどちらもコマンドの区切りとして認識される。

Special Characters

以下は特殊文字として扱われる。

; | & ^ $ ? * < > ( ) [ ] { } ` " ' TAB SPACE NEWLINE

これらの文字を文字として使いたい場合は back slash \ or single quotation '' で囲む必要がある。

Character Explanation
'' 囲まれた文字を全て文字列として扱う
"" $ \ ` を評価した後の文字を全て文字列として扱う
`` コマンドとして評価する

Variable

Shellscript で変数を使いたい場合、空白なしイコール = で代入できる。
また、$ or ${} を用いて変数を参照できる。

$ VAR=value
$ echo $VAR
value
$ echo ${VAR}
value

このように定義された変数はそのプロセス内でしか参照できないが、
export で指定すると子プロセスでも参照できるようになる。
(ただし、子 → 親は無理)

また、変数が NULL だった場合の処理を簡単に書ける以下のような記述法がある。

${VAR:-expression}    # VAR が NULL の場合 expression を返す
${VAR:+expression}    # VAR が NOT NULL の場合 expression を返す
${VAR:=expression}    # VAR が NULL の場合 VAR に expression を代入し expression を返す
${VAR:?[expression]}  # VAR が NULL の場合 expression を標準エラー出力

Arguments

Shellscript の引数は $0 - $9 として最大 9 つまで受け付けることができる。

Variable Explanation
$0 Script name
$1 - $9 Arguments from 1st - 9th
$# Number of arguments
$* All arguments ("$*"$1 $2 ...)

Test Command

条件判定で使われる [] は test コマンドと呼ばれるものでコマンドである。
従って、中身は常に space を必要とするし、使い方も直感的なものとは少し異なる。

Statements

if statement

if [ condition1 ]
then
    ...
elif [ condition2 ]
    ...
else
    ...
fi

case statement

case $VAR  in
    )
        ...
        ;;
    )
        ...
        ;;
esac

while statement

while [ condition ]
do
    ...
done

for statement

for var in 0 1 2 3 4  #範囲の書き方(Bash独自) => {0..4}
do
    ...
done
aiskyaisky

#!/bin/sh について (shebang)

その shellscript を実行すべき shell を指定するための記述である。
#!/bin/sh の間には space を入れないのが better。
ちなみに

  • /bin/sh: その OS の標準の shell への symbolic link
  • /bin/bash: 本物の bash

の違いがあるので、bash 特有の構文を用いている場合には sh ではなく bash を指定する必要がある。

aiskyaisky

Option の使い方

getopts という Unix の shell command を用いる。
使い方は

getopts optstring name

のように使う。
ここで optstring は option として認識されるべき文字列、namegetopts が認識した option が (順に) 代入される変数である。
使用例は以下のよう。

while getopts ":ab:h" optKey
do
  case "$optKey" in
    a)
      # -aの場合の実行内容
      ;;
    b)
      # -bの場合の実行内容
      # 引数は ${OPTARG} で取得できる
      ;;
    '-h'|'--help'|* )
      # -h、--helpの場合、もしくは-a、-b以外の場合の実行内容
      ;;
  esac
done

ここで、:ab:h の最初のコロン : は存在しない option が実行された際にエラーを非表示にすることを表し、アルファベットの後のコロンはその option が引数付きで実行されるべきことを示す。

ただし、このファイルをオプションなしで実行した場合、getopts がそもそも何も返さないことから while 文が実行されず、素通りされることに注意。
そのため、option が必須の shellscript を作りたい場合は違う方法ではじく必要がある。