Shellscript
業務で shellscript を書きたくなることが多々あるので、調べたことのメモ
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
#!/bin/sh
について (shebang)
その shellscript を実行すべき shell を指定するための記述である。
#!
と /bin/sh
の間には space を入れないのが better。
ちなみに
-
/bin/sh
: その OS の標準の shell への symbolic link -
/bin/bash
: 本物のbash
の違いがあるので、bash
特有の構文を用いている場合には sh
ではなく bash
を指定する必要がある。
Option の使い方
getopts
という Unix の shell command を用いる。
使い方は
getopts optstring name
のように使う。
ここで optstring
は option として認識されるべき文字列、name
は getopts
が認識した 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 を作りたい場合は違う方法ではじく必要がある。