LoginSignup
7
9

More than 5 years have passed since last update.

シェルスクリプト再入門

Posted at

概要

  • Unixコマンドをまとめたもの
  • ループや条件分岐も可能で、プログラミングっぽく書ける
  • 複雑な処理や面倒な処理を、シェルスクリプトで書いておくと、処理時間の短縮などが実現が可能

1. まずは実行権限を与える

$ touch test.sh
$ chmod +x test.sh

実行権限がなければ実行出来ないので、このように対象ファイルにchmod +xで実行権限を与えておきましょう。

2. 変数を使ってみる

注意して覚えておく事

  • 変数を代入する場合は、=の前後にスペースを入れてはだめ
  • 変数利用時は下記のようにして使える
    • $hoge
    • `"$hoge"
    • `${hoge}
    • "${hoge}"
  • シングルクォートで囲ってしまうと変数展開されない
#/bin/bash

# 変数代入時は=の前後にスペース入れたらダメ
helloString="Hello"

# 下記のようにどのように括っても変数を利用可能
echo $helloString
echo "$helloString"
echo ${helloString}

# 文字列連結はつなげるだけで良い
echo ${helloString} ${helloString}

# シングルクォートで囲ってしまうと、変数展開されない
echo '$helloString'
実行結果
Hello
Hello
Hello
Hello Hello
$helloString

3. 計算してみる

#/bin/bash

x=10

# このように計算式を書いても、ただの文字列として扱われてしまう
echo $x+2

# '`(バッククォート)'は、中の式を評価してその結果を返す
# exprは、後の文字列を数値として計算する
echo `expr $x + 2`

3. 計算をしてみる

四則演算をする上でも独自ルールがあったりするので注意しましょう。

  • 計算を行う場合は、バックスラッシュで囲う
  • 計算は、exprを使う
  • 掛け算の時だけ、*の前に\を付ける
  • 括弧で計算順序を処理する場合は、()をつけ、この括弧の前もバックスラッシュを付ける
#/bin/bash

x=10

# このように計算式を書いても、ただの文字列として扱われてしまう
echo $x+2

# '`(バッククォート)'は、中の式を評価してその結果を返す
# exprは、後の文字列を数値として計算する
# 全てスペースを入れる
echo `expr $x + 2`
echo `expr $x - 2`
echo `expr $x / 2`

# 掛け算の場合だけ、"*"の前にバックスラッシュを入れないとSyntaxErrorになってしまう
echo `expr $x \* 2`

# 掛け順を指定する場合括弧を使うが、その場合も括弧の前にバックスラッシュを入れる
echo `expr \( $x + 10 \) \* 100`
実行結果
10+2
12
8
5
20
2000

4. 配列を扱う

  • 配列を扱うには()括弧で囲う
  • 要素にアクセスする場合は、{}中括弧と、[]括弧を使う
    • ex) echo ${x[1]}`
  • 要素全てを出すには、*か、@を指定する
    • ex) echo ${x[*]}
    • 数を出すには、#を使う
      • ex) echo ${#x[*]}
  • コマンドの実行結果も()括弧でくくうと、結果を配列に入れられる
#/bin/bash

# 配列は丸括弧で囲う
x=(2 4 6)

# 配列の変数をそのまま指定すると、先頭を指す
echo 'echo $x >>>' $x

# 配列の要素にアクセスする
echo 'echo ${x[0]} >>>' ${x[0]}
echo 'echo ${x[1]} >>>' ${x[1]}
echo 'echo ${x[2]} >>>' ${x[2]}
echo 'echo ${x[3]}(is not exist key) >>>' ${x[3]}

# 全ての配列を表示
echo 'echo ${x[*]}>>>' ${x[*]}

# 配列の要素数
echo 'echo ${#x[*]}(配列の要素数を調べる) >>>' ${#x[*]}
echo 'echo ${#x[@]}(配列の要素数を調べる) >>>' ${#x[@]}

# 配列に値を代入する
echo '代入前の2番目>>>' ${x[2]}

# 代入
x[2]=100

echo '代入後の2番目>>>' ${x[2]}

# 変数にコマンドの実行結果を配列に代入する
date=(`date`)
echo 'dateコマンドの実行結果の要素数>>> ' ${#date[*]}
echo 'dateコマンドの実行結果1番目 >>>   '${date[0]}
echo 'dateコマンドの実行結果2番目 >>>   '${date[1]}
echo 'dateコマンドの実行結果3番目 >>>   '${date[2]}
echo 'dateコマンドの実行結果4番目 >>>   '${date[3]}
echo 'dateコマンドの実行結果5番目 >>>   '${date[4]}
実行結果
echo $x >>> 2
echo ${x[0]} >>> 2
echo ${x[1]} >>> 4
echo ${x[2]} >>> 6
echo ${x[3]}(is not exist key) >>>
echo ${x[*]}>>> 2 4 6
echo ${#x[*]}(配列の要素数を調べる) >>> 3
echo ${#x[@]}(配列の要素数を調べる) >>> 3
代入前の2番目>>> 6
代入後の2番目>>> 100
dateコマンドの実行結果の要素数>>>  5
dateコマンドの実行結果1番目 >>>   2017年
dateコマンドの実行結果2番目 >>>   9月19日
dateコマンドの実行結果3番目 >>>   火曜日
dateコマンドの実行結果4番目 >>>   14時10分32秒
dateコマンドの実行結果5番目 >>>   JST

5. 比較

testコマンドによる比較をまとめておきます。

オプション 略名 仕様例 説明
-eq equal test ${x} -eq ${y} xとyがイコールならtrue
-ne not equal test ${x} -nq ${y} xとyが!=(ノットイコール)ならtrue
-gt grater than test ${x} -gt ${y} x > yならtrue
-ge grater than or equal test ${x} -ge ${y} x >= yならtrue
-lt less than test ${x} -lt ${y} x < yならtrue
-le less than or equal test ${x} -le ${y} x <= yならtrue

一通り示した例

$?というのは、直前の評価式の結果を表しており、下記のようになります。
- 0: 正常終了
- 0以外: 異常終了

#/bin/bash

# -eq
test 2 -eq 3;
echo '2 === 3の実行結果は >>> ' $?
test 2 -eq 2;
echo '2 === 2の実行結果は >>> ' $?

# -ne
test 2 -ne 3;
echo '2 !== 3の実行結果は >>> ' $?

# -gt
test 2 -gt 2;
echo '2 > 2の実行結果は >>> ' $?

# -ge
test 2 -ge 2;
echo '2 => 2の実行結果は >>> ' $?

# -lt
test 2 -lt 2;
echo '2 < 2の実行結果は >>> ' $?

# -le
test 2 -le 2;
echo '2 =< 2の実行結果は >>> ' $?
実行結果
2 === 3の実行結果は >>>  1
2 === 2の実行結果は >>>  0
2 !== 3の実行結果は >>>  0
2 > 2の実行結果は >>>  1
2 => 2の実行結果は >>>  0
2 < 2の実行結果は >>>  1
2 =< 2の実行結果は >>>  0
7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9