このページの内容は前回「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の出力結果ファイルの内容を、昇順・重複なしで出力するコマンドを記述してください。