目次

シェルスクリプトの書き方

1行目の「#!/bin/sh」はどのシェルで実行するかを宣言. C言語でいう「#include<stdio.h>」みたいなものだから,おまじないだと思っとけばおk.
「#!」ってなんぞや?と気になったらココ見ればいいと思う.

#!/bin/sh

処理

「/bin/sh」は環境によって変わるので,以下のコマンドで確認.

which sh

変数のあれこれ

変数に代入する時はスペースを入れない事!

○ X=10

× X = 10

変数を使う場合は,変数名の先頭に「$」を付けるか,「${」〜「}」で囲って使用.

echo $OPPAI
echo ${OPPAI}
echo "$OPPAI"
OUT="$BIG$OPPAI" ←$BIGと$OPPAIに入っている文字列の結合
echo '$OUTの値は' "$OUTです"

変数を削除するには「unset」を使えばおk.

unset(変数);

ダブルクォーテーション「"」で文字列を括ると,その中にある変数は展開される.
シングルクォーテーション「'」で文字列を括ると,文字列定数として扱われる.
バッククォーテーション「`」で文字列を括ると,コマンドとして扱われる.

特殊な変数

変数意味
$?直前に実行されたコマンドや関数の戻り値
$0実行コマンド名
$1 $2 …実行時引数.$1は1つ目の引数,$2は2つ目の引数のように対応.
$*全引数
$@全引数(それぞれの引数がダブルクォーテーションで囲まれる)
$#引数の個数
$$当シェルのプロセスID
$!最後に呼び出されたバックグラウンドコマンドのプロセスID
$-シェルのオプション(フラグ)の内容.
$_シェルスクリプト内で使った場合,起動されたシェルのファイル名.$0と同じ.それ以外の場合、直前に実行したコマンドの最後の引数.

演算

算術演算子意味
a + baとbの足し算
a - baとbの引き算
a \* baとbのかけ算
a / baとbの割り算
a % baとbの余り

制御構文

if

コマンドの実行結果(戻り値)が正常(0)の場合,thenの部分を実行する. エラー(0以外)の場合、elseの部分を実行する.

if コマンド1
	then
		処理1
elif コマンド2
	then
		処理2-1
	else
		処理2-2
fi

if test "$GEHO" = "hoge"
	then
		echo '$GEHOの値はhogeです'
	else
		echo '$GEHOの値はhogeじゃない'
fi
if rm Memo.txt
	then
		echo "Remove Success !"
	else
		echo "Remove Fail !"
fi
if [ "$GEHO" = "hoge" ]
	then
		echo '$GEHOの値はhogeです'
	else
		echo '$GEHOの値はhogeじゃない'
fi

case

変数がパターンに一致した場合,その部分の処理が実行される. また,「*)」を設置する事によって,パターンに一致しない場合の処理をさせる事ができる.

case $変数 in
	パターン1)
		処理1
	;;
	パターン2)
		処理2
	;;
	パターン3 | パターン4)
		処理34
	;;
	*)
		処理
	;;
esac

# キーボード入力
echo -n "1〜3の数字を入力して下さい."
read NUM

case "$NUM" in
	1)
		echo "1が入力されました."
	;;
	2 | 3)
		echo "2 or 3が入力されました."
	;;
	*)
		echo "1〜3以外の数字が入力されました."
	;;
esac

for

for 変数 in 引数1 引数2 …
do
	処理
done

while

while [ 条件 ]
do
	処理
done

until

until [ 条件 ]
do
	処理
done

条件

数値比較

数値評価演算子C言語意味
A -eq BA == BAとBが等しい場合に真
A -ne BA != BAとBが等しくない場合に真
A -gt BA > BAがBより大きい場合に真
A -lt BA < BAがBより小さい場合に真
A -ge BA => BAがBより大きいか等しい場合に真
A -le BA =< BAがBより小さいか等しい場合に真

文字列比較

文字列評価演算子意味
文字列文字列の長さが0より大きければ真
-n 文字列文字列の長さが0より大きければ真
! 文字列文字列の長さが0であれば真
-z 文字列文字列の長さが0であれば真
文字列1 = 文字列22つの文字列が等しければ真
文字列1 != 文字列22つの文字列が等しくなければ真

ファイルチェック

ファイルチェック演算子意味
-d ファイル名ディレクトリなら真
-f ファイル名通常ファイルなら真
-L ファイル名シンボリックリンクなら真
-r ファイル名読み取り可能ファイルなら真
-w ファイル名書き込み可能ファイルなら真
-x ファイル名実行可能ファイルなら真
-s ファイル名サイズが0より大きければ真
ファイル1 -nt ファイル2ファイル1がファイル2より新しければ真
ファイル1 -ot ファイル2ファイル1がファイル2より古ければ真

論理結合

論理結合演算子C言語意味
! 条件! 条件条件が偽であれば真
条件1 -a 条件2条件1 && 条件2条件1が真、かつ、条件2が真であれば真
条件1 -o 条件2条件1 || 条件2条件1が真、または、条件2が真であれば真

※ 上の表で||が全角表記になっていますが,pukiwikiの仕様です.

コマンド

sed

s/置換前/置換後/

「\(」と「\)」で囲むと後方参照ができる

後方参照した値は \1 - \n とする事で参照できる

STRING="Hoge, Fuga, Piyo, Foo, Bar, Baz"
echo $STRING | sed -e 's/^\(.*\)\/$/\1/'

スクリプト集

パス文字列からファイル名/ディレクトリ名/拡張子を抽出する

パスを次のように代入していると仮定する.

PATH="/Users/batako/Download/pantsu.zip"

フルファイル名取得

echo ${PATH##*/}

#出力結果:pantsu.zip

ファイル名取得

full_filename=${PATH##*/}
echo ${full_filename%.*}

#出力結果:pantsu

ファイルがある場所のパス取得

PATHがファイル名のみの場合ファイル名になる。

echo ${PATH%/*}

#出力結果:/Users/batako/Download

拡張子

echo ${PATH##*.}

#出力結果:zip

指定したディレクトリ内の全ファイル名を取得する

指定ディレクトリの最後の「/」は省略可能.

DIRECTORY_PATH="/Users/batako/Download/"

for FILE_PATH in `echo $DIRECTORY_PATH/ | sed -e "s/\/\//\//g"`*
do
  echo ${FILE_PATH##*/}
done

相対パスから絶対パスに変換

指定ディレクトリの最後の「/」は省略可能.

PATH="Download/pantsu.zip"

if [ -d $PATH ]
        then
                echo `cd ${PATH%/*};pwd`
        else
                echo `cd ${PATH%/*};pwd`/${PATH##*/}
fi

文字列を分割して配列に代入

split が存在しないので代替え

その1

IFS により区切り文字を切り替える(デフォルトだと半角スペース)

set -- $STRING により IFS のルールで区切って $1, $2, ... と代入される

STRING='hoge,fuga,bar'
IFS=','
set -- $STRING
for value in ${@};do
    echo ${value}
done

その2

STRING='hoge,fuga,bar'
ary=( `echo $STRING | tr -s ',' ' '`)
for value in ${ary[@]};do
    echo ${value}
done

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-01-16 (土) 18:03:30 (435d)