Search

bash script 基本文法

2015年8月18日

基本操作

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行目のこと。
起動してスクリプトを読み込むインタプリタを指定する

詳しくはwikiへ

基本的には、「#!/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

以上