基本操作
vi test.sh
sh ./test.sh
CTRL
コマンド | 内容 |
---|---|
CTRL+C | 現在のコマンドを中止する |
CTRL+D | 入力を終了する |
CTRL+\ | CTRL+Cが効かない場合に現在のコマンドを中止する |
CTRL+S | 画面への出力を停止する |
CTRL+Q | 画面への出力を再開する |
DELまたはCTRL+? | 最後の文字を削除する |
CTRL+U | コマンドライン令体を削除する |
CTRL+Z | 現在のコマンドを一時停止する(8章を参照) |
基本文法
シバン
#!から始まる1行目のこと。
起動してスクリプトを読み込むインタプリタを指定する
基本的には、「#!/bin/bash」を指定する。
「#!/bin/bash」と「#!/bin/sh」では動作が異なる。
http://sechiro.hatenablog.com/entry/20120806/1344267619
変数
グローバル変数
HOST="AAAA"
※変数は大文字にすること。
ローカル変数
str="aaaa"
※変数は小文字にすること。
数値
num=1
文字列
str="abcc"
配列
array=("AAA" "CCC" "GGG" "TTT")
取り出し
echo ${array[0]}
⇒AAA
echo ${array[1]}
⇒CCC
echo ${ARRAY[@]}
⇒AAA CCC GGG TTT
要素の追加
array=("${array[@]}" "ZZZ")
array+=("123")
要素の変更
$array[0]="QQQ"
特殊変数
特殊変数 | 内容 |
---|---|
$# | 引数を受ける変数$0,$1,$2に実際に値が入っている数が入っている。 ⇒ ./test.sh a b c と実行した場合、3が入る。 |
$0 | 実行されたシェルスクリプトの実行ファイル名 ⇒ ./test.sh a b c と実行した場合、test.shが入る。 |
$? | 直前に実行されたコマンドステータス 0:正常完了 1~255: 以上終了 |
$@ | 配列の総数をさす。 ⇒./test.sh a b c と実行した場合、a b cが入る。 |
$* | $@と同様。シェル内部で、変数IFSに値をセットすると、その区切り文字で表示することができる。 この場合はダブルクオーテーション(")で囲む必要がある。 $ IFS=: $ echo "$*" a:b:c |
数値計算
num=1
num=`expr $num + 1`
下記のいずれかでも可能
let x=num+1
num=$(($num+1))
num=$[$num+1]
文字列連結
str1="test1 "
str2="test2 "
result=$str1$str2
echo $result
⇒test1 test2
文字列切り出し
str="abcdefgabcdefg"
echo ${#str}
⇒14
echo ${str:1:2}
⇒bc
文字列置換
//は全部置換、/は最初にマッチしたものだけを置換
echo ${str//d/Z}
⇒abcZefgabcZefg
echo ${str/d/Z}
⇒abcZefgabcdefg
文字列分割
IFSで区切り文字を設定する
str="abc/dfg/hij/klmn"
IFS="/"
FEATURES=(${str})
echo ${str}
⇒abc dfg hij klmn
条件分岐
if
単一条件
if 条件式 ; then
処理
fi
単一条件+条件外処理
if 条件式 ; then
処理1
else
処理2
fi
複数条件
if 条件式1 ; then
処理1
elif 条件式2 ; then
処理2
else
処理3
fi
比較
数値
比較演算子 | 使用例 | 意味 |
---|---|---|
-eq | if num1 -eq num2 | num1 と num2 が等しければ真となる。 |
-ne | if num1 -ne num2 | num1 と num2 が等しくなければ真となる。 |
-lt | if num1 -lt num2 | num1 が num2 より小ならば真となる。 |
-le | if num1 -le num2 | num1 が num2 以下ならば真となる。 |
-gt | if num1 -gt num2 | num1 が num2 より大ならば真となる。 |
-ge | if num1 -ge num2 | num1 が num2 以上ならば真となる |
文字列
比較演算子 | 使用例 | 意味 |
---|---|---|
= | if str1 = str2 | str1 と str2 が等しければ真となる。 |
!= | if str1 != str2 | str1 と str2 が等しくなければ真となる。 |
その他比較
比較演算子 | 使用例 | 意味 |
---|---|---|
-z | if -z string | string の文字列長が 0 ならば真となる。 |
-n | if -n string | string の文字列長が 0 より大ならば真となる。 |
-d | if -d file | file がディレクトリならば真となる。 |
-f | if -f file | file が普通のファイルならば真となる。 |
-s | if -s file | file が 0 より大きいサイズならば真となる。 |
-e | if -e file | file が存在するならば真となる。 |
-r | if -r file | file が読み取り可能ならば真となる。 |
-w | if -w file | file が書き込み可能ならば真となる。 |
-x | if -x file | file が実行可能ならば真となる。 |
AND条件
if 条件式x1 -a 条件式x2; then
..
fi
if 条件式x1 && 条件式x2; then
...
fi
OR 条件
if 条件式x1 -o 条件式x2; then
...
fi
if 条件式x1 || 条件式x2; then
...
fi
AND 条件と OR 条件
if 条件式x1 -a 条件式x2 -o 条件式x3; then
...
fi
NOT 条件
if ! 条件式x1 ; then
...
fi
test コマンド
$ test 1 -eq 1 ; echo $?
0
$ test 1 -eq 2 ; echo $?
1
※↑2つの数値がイコールである場合のみ、真(終了ステータスが「0」)となる。
繰り返し
for
list=(1 2 3 4)
for i in "${list[@]}"; do
echo $i
done
list=(1 2 3 4)
for (( i = 0; i <= ${#list[@]}; ++i )); do echo $i done
while
str="a"
cat testfile.txt | while read LINE
do
str=$LINE
done
echo $str
⇒a
※上記だとwhile ループ内で変数が変更されない。そのため、下記のように記載する。
str="a"
while read LINE
do
str=$LINE
done
echo $str
⇒test
関数
#
function test_echo() {
echo "test_hogehoge"
}
test_echo
⇒test_hogehoge
※引数がある場合
function test_echo() {
echo $1" "$2" ""test_hogehoge"
}
test_echo a b
⇒a b test_hogehoge
処理の流れ
基本的に上から読み込まれるため、関数は上のほうに書き、下部にプロセスを書いていく。
参考
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231154/
http://www.atmarkit.co.jp/ait/articles/0010/19/news003.html
http://shellscript.sunone.me/if_and_test.html
http://bi.biopapyrus.net/linux/bash.html
以上