bash script 基本文法

基本操作

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
比較
数値
比較演算子使用例意味
-eqif num1 -eq num2num1 と num2 が等しければ真となる。
-neif num1 -ne num2num1 と num2 が等しくなければ真となる。
-ltif num1 -lt num2num1 が num2 より小ならば真となる。
-leif num1 -le num2num1 が num2 以下ならば真となる。
-gtif num1 -gt num2num1 が num2 より大ならば真となる。
-geif num1 -ge num2num1 が num2 以上ならば真となる
文字列
比較演算子使用例意味
=if str1 = str2str1 と str2 が等しければ真となる。
!=if str1 != str2str1 と str2 が等しくなければ真となる。
その他比較
比較演算子使用例意味
-zif -z stringstring の文字列長が 0 ならば真となる。
-nif -n stringstring の文字列長が 0 より大ならば真となる。
-dif -d filefile がディレクトリならば真となる。
-fif -f filefile が普通のファイルならば真となる。
-sif -s filefile が 0 より大きいサイズならば真となる。
-eif -e filefile が存在するならば真となる。
-rif -r filefile が読み取り可能ならば真となる。
-wif -w filefile が書き込み可能ならば真となる。
-xif -x filefile が実行可能ならば真となる。
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

処理の流れ

基本的に上から読み込まれるため、関数は上のほうに書き、下部にプロセスを書いていく。

参考

以上

このブログの人気の投稿

RAC環境でimpdpをパラレルで実行するとき

ctrl+s 操作が不能に

TrustedInstaller.exe メモリリーク