Bashを使ってみよう

このページの内容は前回「Bashとは」を試した前提で進めます。

Bashでは変数や制御構文といった機能を組み合わせることで、 複雑な処理を組み立てていくことができます。

詳しいBashの仕様や使い方は以下など参考になるかと思います。

以下の例を実際にターミナルに打ちこんで試してみましょう。

変数

計算結果などを一時的に保存しておくための入れ物として使えます。

# 変数定義(数値)
num=1

# 変数の内容を表示
echo $num
# => 1

# 数値計算
# $(( )) で括ります
# 参考: Bash で計算してみる
# http://www.odin.hyork.net/write/write0293.html
echo $(( $num + 2 ))
# => 3

# 変数定義(文字列)
str="sum"

# 変数や文字列、計算結果を結合
result=$str'='$(( $num1 + $num2 ))
echo $result
# => sum=3

# 変数定義(配列)
# 参考: 配列を使用する
# http://shellscript.sunone.me/array.html
arr=(1 2 "abc")

# 配列の長さ
echo ${#arr[@]}
# => 3

# 配列の全要素を列挙
echo ${arr[@]}
# => 1 2 abc

# 配列の各要素を表示
echo ${arr[0]}
# => 1
echo ${arr[1]}
# => 2
echo ${arr[2]}
# => abc

制御構文

繰り返し処理や条件分岐を仕込むことができます。

vim for_loop.sh
--↓からコピペ--
#!/bin/bash

arr=$(seq 1 10)

for i in $arr; do
    if `test $((i % 2)) = 0 `; then
        date;
    fi
    sleep 1;
done
--↑までコピペ--

# 実行
bash for_loop.sh
# 1秒おきに日時が表示される(5回)
火  5 24 15:29:40 JST 2016
火  5 24 15:29:42 JST 2016
火  5 24 15:29:44 JST 2016
火  5 24 15:29:46 JST 2016
火  5 24 15:29:48 JST 2016

if文の条件判定部分は、下記のように書くこともできます(testコマンドの省略記法)。

if [ $((i % 2)) = 0 ]; then

参考: if 文と test コマンド

リダイレクト

コマンドの出力結果をファイルに保存できます。

# date_test.txtに
# dateコマンドの出力結果を保存
date > date_test.txt

# date_test.txtに
# dateコマンドの出力結果を追記
date >> date_test.txt

# date_test.txt の内容表示
cat date_test.txt
# => yyyy年  ○月 ○○日 火曜日 hh:mm:ss UTC
# => yyyy年  ○月 ○○日 火曜日 hh:mm:ss UTC

パイプ

前のコマンドの実行結果を次のコマンドの入力として利用する事ができます。

date
# => 2016年  ○月 ○○日 火曜日 05:26:16 UTC

# 参考: cut テキストを切り出す
http://x68000.q-e-d.net/~68user/unix/pickup?cut
date | cut -d ' ' -f 1
# => 2016年

課題

これまでの内容を応用して以下の課題を試してみましょう。

課題 1

bashには、$RANDOMという変数が存在しており、0から32767までのランダム整数を取得することができます。

echo $RANDOM
# => 591
echo $RANDOM
# => 16104
...

この変数を使用して、0から31までの範囲の整数を50個表示するシェルスクリプトファイル(例:random_numbers.sh)を記述してください(ただし、1行に1つの数 => 全部で50行となるようにする)。

そのスクリプトの出力結果を適当なファイル(random_test.txtなど)に保存しておいてください。

参考

課題 2

課題1の出力結果ファイルの内容を、昇順・重複なしで出力するコマンドを記述してください。


次のAWS入門記事: Webサーバーとは?