bashメモ

相対パスから絶対パスを取得

$(cd $(dirname $1) && pwd)/$(basename $1)

基本サンプルコード

#!/bin/bash

################################################################################
# test.sh
################################################################################
echo "test"
#echo "test2" > info.txt

################################################################################
#シェル変数、参照する時は$をつける($str)、代入する時はスペースを入れていけない
################################################################################
str="hoge"	

################################################################################
#特殊変数鵜
# $n	nは数字であり、$0はシェルスクリプト名、以降$1、$2…は第1引数、第2引数…である。第10引数以降は${10}、${11}…で参照する。
# $#	与えられた引数の個数
# $@	$0以外の全ての引数("$@"のようにダブルクォーテーションで囲んだ場合"$1" "$2" …"のように個別に展開される。)
# $*	$0以外の全ての引数("$@"のようにダブルクォーテーションで囲んだ場合"$1 $2 …"のように展開される。)
# $?	最後に実行したコマンドの終了ステータス
# $!	最後に実行したバックグラウンドコマンドのPID
# $$	シェルのPID
# $-	現在のオプションフラグ
################################################################################
echo "------------------------- 特殊変数"
echo ${0}
echo ${#}
echo ${@}
echo ${*}
echo ${?}
echo ${!}
echo ${$}
echo ${-}


################################################################################
# 算術演算子 
#  数値演算、関係演算(result=`expr 計算式`)でOK
#   文字列演算()
################################################################################
echo "------------------------- 演算子"
san1=`expr 10 + 20`
san2=`expr 20 - 10`
echo "算術結果:" ${san1}
echo "算術結果:" ${san2}

num1=30
num2=20
san3=`expr ${num1} > ${num2}`	#これは失敗
echo "関係演算:" ${san3}

san4=`expr index "abc" "ab"`
echo "文字列演算結果:" ${san4}

san5=`expr length "abcdefg"`
echo "文字列演算結果:" ${san5}

san6=`expr substr "aiueo" 2 3`
echo "文字列演算結果:" ${san6}


################################################################################
# if(条件を" [ ] "で囲む場合は" [ "及び" ] "の前後に半角スペースを入れる必要があることに注意してください。)

#ファイル形式のチェック
#-b ファイル名	指定したファイルがブロックデバイスファイルなら真である。
#-c ファイル名	指定したファイルがキャラクタデバイスファイルなら真である。
#-d ファイル名	指定したファイルがディレクトリなら真である。
#-f ファイル名	指定したファイルが通常ファイルなら真である。
#-L ファイル名	指定したファイルがシンボリックリンクなら真である。
#-p ファイル名	指定したファイルが名前付きパイプなら真である。
#-S ファイル名	指定したファイルがソケットなら真である。

#ファイルパーミッションのチェック
#-g ファイル名	指定したファイルにSGIDがセットされていれば真である。
#-k ファイル名	指定したファイルにスティッキービットがセットされていれば真である。
#-r ファイル名	指定したファイルが読み取り可能なら真である。
#-u ファイル名	指定したファイルにSUIDがセットされていれば真である。
#-w ファイル名	指定したファイルが書き込み可能なら真である。
#-x ファイル名	指定したファイルが実行可能なら真である。

#その他のファイルのチェック
#-e ファイル名	指定したファイルが存在すれば真である。
#-s ファイル名	指定したファイルのファイルサイズが0より大きければ真である。

#文字列のチェック
#-n 文字列	文字列の長さが0より大きければ真である。
#-z 文字列	文字列の長さが0であれば真である。
#文字列1 = 文字列2	2つの文字列が等しければ真である。
#文字列1 != 文字列2	2つの文字列が等しくなければ真である。

#数値のチェック
#数値1 -eq 数値2	2つの数値が等しければ真である。
#数値1 -ge 数値2	数値1が数値2以上であれば真である。
#数値1 -gt 数値2	数値1が数値2より大きいのであれば真である。
#数値1 -le 数値2	数値1が数値2以下であれば真である。
#数値1 -lt 数値2	数値1が数値2未満であれば真である。
#数値1 -ne 数値2	2つの数値が等しくなければ真である。

#論理結合
#!条件	条件が偽であれば真である。
#条件1 -a 条件2	条件1と条件2の両方が真であれば真である。
#条件1 -o 条件2	条件1と条件2のどちらかが真であれば真である。
################################################################################
echo "------------------------- if [...]"
if [ "${str}" = "hoge" ]
then
	echo "strはhogeです" 
else
	 "strはhogeではない" 
fi

echo "------------------------- if test"
if test "${str}" = "hoge"
then
	echo "strはhogeです" 
fi

echo "------------------------- ifディレクトリチェック"
#ディレクトリチェック
t_dir="test_dir"
if [ -d ${t_dir} ]
then
	echo ${t_dir} "はディレクトリだ"
fi

echo "------------------------- ifファイルチェック"
#ファイルチェック
if [ -e "info.txt" ]
then
	echo "info.txtは存在する"
fi


################################################################################
# case
################################################################################
echo "------------------------- case"
str2="abc"
case ${str2} in
	"abc")
			echo "abc";;
	"def")
			echo "def";;
esac


################################################################################
# for
################################################################################
echo "------------------------- for"
for aa in aka ao ki
do
	echo ${aa}	
done


################################################################################
# while
################################################################################
echo "------------------------- while"
count=3
while [ ${count} -gt 0 ]
do 
	echo "${count}"
	count=`expr ${count} - 1`
done


################################################################################
# until
################################################################################
echo "------------------------- until"
count=3
until [ ${count} -eq 0 ]
do
	echo ${count}
	count=`expr ${count} - 1`
done


################################################################################
# break,continue(他と同じなので無し)
################################################################################


################################################################################
# 関数
# 関数に引数を渡す場合は、シェルと同じようにスペース区切りで渡します。
# 関数に渡された引数を参照する場合も、シェルと同じように「$1, $2, ...」と参照します。
# 呼び出し元に終了コードを返す場合は「return コード」と記述します。
################################################################################
echo "------------------------- 関数"
arg_chk()
{
	if test ${#} -eq 2
	then 
		return 0
	else
		return 1
	fi
}

arg_chk 1 2
ret=${?}	#最後に実行したコマンドの終了ステータスが戻り値
echo ${ret}


################################################################################
# サンプルスクリプト
################################################################################
echo "------------------------- ls *.txtの結果、正規表現のテスト"
for txt in `ls *.txt`
do
	if [[ ${txt} =~ ^info ]] 	#正規表現をダブルコートで囲まない事!
	then
		echo ${txt}
	fi
done


echo "------------------------- ファイル読み込み"
while read line
do
	echo ${line}
done < "info2.txt" 

echo "------------------------- 他のファイルを読み込む、[ドット][スペース][ファイル名]"
. lib.sh
hello "テスト"

echo "------------------------- ディレクトリのファイルリストを取得、lsコマンドの結果を展開"
for f in $(ls -a)	#コマンド実効、$(コマンド)
do
	if [ -f ${f} ]
	then 
		echo ${f}
	fi
done

echo "------------------------- ディレクトリのファイルリストを取得、findコマンドの結果を展開"
dir="./"
for f in $(find ${dir})
do
	if [ -f ${f} ]
	then
		base=$(basename ${f})
		echo ${base}
	fi
done

echo "------------------------- getopts"
LIST=
TYPE=
opt=
while getopts l:t: opt
do
	case ${opt} in
	l)
		LIST=${OPTARG}
		;;
	t)
		TYPE=${OPTARG}
		;;
#	\?)
#		exit 1
#		;;
	esac
done
echo "LIST=${LIST}"
echo "TYPE=${TYPE}"


echo "------------------------- シーケンス"
for i in 'seq 0 9'
do
	echo $i
done