shell script

なんかshellって忘れやすいので色々メモ

特殊変数

shellでもperlでもrubyでもいいんだけど、 特殊変数という、たとえば、$1みたいな変数がある。

これを特殊変数というんだけど、 特殊変数という言葉を良く忘れて、ググれなくなったりする。

特殊変数とちょっと関係ありそうな奴。

$#

$@

$*

$0

$1 から $9

shift はまたあとで書く。

$? 最後に実行した結果がはいってる。

$$ プロセス番号

$-

$!

IFS 区切り文字

環境変数

もちろん、もってますよね。実行ユーザがいるんだから。

envとかprintenvとかdeclareでみれる。

消したいときは、

export -n ENV_VAR

で、変数名ごときえて、中身だけ消したければ、

export ENV_VAR=

とかやる。

ファイルネームまわり

ファイルパスの文字列からいろいろ取得するためのもろもろ

FILE_PATH="/etc/httpd/httpd.conf"
 
# ファイル名を取得
FILE_NAME=${FILE_PATH##*/}

# 拡張子を取得
EXT=${FILE_PATH##*.}

# 拡張子を除いたファイル名
FILE=${FILE_NAME%.*}
 
# ディレクトリ名を取得
DIR_NAME=${FILE_PATH%/*}
# もしくは
DIR_NAME=`dirname ${FILE_PATH}

良くあるかきかたとして、今実行しているファイルの絶対パス

ABS_PATH=$(cd $(dirname $0);pwd)

関数

つーか変数の話でいうと、関数の中で宣言した変数もそのままだとグローバル変数になっちゃうので、

hoge() {
    local VALUE='aaaa'
}

みたいに、localをつけて宣言する。

ちなみに、read_onlyを付けると定数を作れる。

local read_only VALUEとかやれば、ローカルの定数。

returnは普通のshellを実行したときの終了ステータスになるから、0から255。 返り値が欲しいときは、echoしたりする。実行側で上手く使う例えば、こんな感じ

hoge() {
    local VALUE='aaaa'
    echo ${VALUE}
}

HUGA=`hoge`

引数は特殊変数とshiftをつかって取得する

外部ファイルのよみだしとか

関数があるとファイル分割したくなるんで、ファイル読み出しは、

sourceかもしくは、.をつかう、 たとえば、

source 'unlearned.sh'

みたいな。