ShellのTipsてきなやつ

ShellスクリプトのTipsです。

シェル変数の初期化をする

変数に値が設定されていない場合は、指定された値を返します。

1
: ${VAR:=初期化する値}

パラメーターを取得する

$@ にパラメーターが格納されています。

例えば以下の記述をした for.sh ファイルを作成します。

1
2
3
for role in "$@"; do
echo $role
done

以下のように出力されます。

1
2
3
$ ./for.sh hoge moge
=> hoge
moge

評価結果を変数に格納する

"$()" で囲めば、評価結果を変数に格納することができます。

1
2
3
4
5
6
7
8
9
$ name="$(hostname)"
$ echo $name
=> shoyan-pc

# 以下も同じです。

$ name=`hostname`
$ echo $name
=> shoyan-pc

if と test コマンドの合わせ技

ifとtestコマンドを使う場合はtestコマンドを省略した[]がよく使われます。

[ 文字列1 = 文字列2 ]
[ 数値1 オプション 数値2 ]
[ オプション 評価対象 ]

[ の直後と ] の直前には必ず半角スペースが必要です (無いと正常に動作しません)。

ちなみに比較は == でなくて =です。

シェルの比較は文字列の比較と数値の比較があり、それぞれに対応するオペレーターがあります。
そのせいで複雑になっている印象があります。

数値の比較

数値1と数値2が等しいかどうか

-eq、もしくは =を使います。

1
2
3
4
$  [ 1 -eq 1 ]; echo $?
0
$ [ 1 = 1 ]; echo $?
0

数値1と数値2が等しくないかどうか

-ne を使います。

1
2
$  [ 1 -ne 2 ]; echo $?
0

!= でも動作しますが、慣習的にあまり使わないようです。

文字列の比較

文字列1と文字列2が等しいかどうか

同じ場合にtrueを返す=と その否定である != を使います。

1
2
$  [ "hey" = "hey" ]; echo $?
0

ちなみに数値の比較に使う -eq で比較したところエラーとなりました。

1
2
3
$  [ "hey" -eq "hey" ]; echo $?
[: integer expression expected: hey
2

文字列1と文字列2が等しくないかどうか

文字列比較のNOT条件
!=を使用します。

1
[ "$hoge" != "fuga" ]

数値比較のNOT条件

数値の比較の場合は -ne オプションを使うのが慣習のようです。

1
[ 1 -ne 2 ]

変数が空かどうか

1
[ -z "$hoge" ]

空でないかを判定する場合は -n を使います。

1
[ -n "$hoge" ]

findで抽出したファイルをreadコマンドで1行ずつ処理する

1
find application -type f -name "*.ini" | while read LINE; do wc -l ${LINE}; done;

実行ファイルのあるパスを取得する

1
echo "$(cd $(dirname $0);pwd)"

1つ上のディレクトリは以下のように取得する

1
echo "$(cd $(dirname $0);cd ..;pwd)"

参考リンク