著者:大津 真
LinuxやmacOSなど、UNIX系OSのコマンドラインで使用されるコマンドインタプリタをシェルと呼びます。本連載では高機能シェルとして人気の高い「Bash」の基本操作について説明していきます。最終回となる今回は、シェルで実行可能なプログラミング言語である「シェルスクリプト」について解説します。
シェルスクリプトマガジン Vol.83は以下のリンク先でご購入できます。
図2 図1のコマンド行と同様の処理をするシェルスクリプトの例
1 2 3 4 5 6 |
# サイズの大きなファイルを見つける echo "--「~/ピクチャ」以下にある1Mバイト以上のファイル--" find ~/ピクチャ -type f -size +1M -print0 | \ xargs -0 du | \ sort -nr | \ head -n 5 |
図5 図2のシェルスクリプトを変数を使うように書き換えた例
1 2 3 4 5 6 7 8 |
#!/usr/bin/bash dir=~/ピクチャ size="1M" echo "--「${dir}」以下にある${size}バイト以上のファイル--" find "$dir" -type f -size "+${size}" -print0 | \ xargs -0 du | \ sort -nr | \ head -n 5 |
図6 図5のシェルスクリプトをコマンドライン引数を参照するように書き換えた例
1 2 3 4 5 6 7 8 |
#!/usr/bin/bash dir=$1 size="1M" echo "--「${dir}」以下にある${size}バイト以上のファイル--" find "$dir" -type f -size "+${size}" -print0 | \ xargs -0 du | \ sort -nr | \ head -n 5 |
図7 if文を使用したシェルスクリプトの例
1 2 3 4 5 6 7 |
#!/usr/bin/bash if cd $1 2>/dev/null then echo "${1}に移動しました" else echo "${1}に移動できませんでした" fi |
図8 図6のシェルスクリプトを条件式とif文を使って書き換えた例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/usr/bin/bash if [ $# -eq 0 ] then echo "エラー: 引数でディレクトリを指定してください" exit 1 ←③ fi if [ ! -d "$dir" ] then echo "エラー: ${dir}が見つかりません" exit 1 fi size="1M" echo "--「${dir}」以下にある${size}バイト以上のファイル--" find "$dir" -type f -size "+${size}" -print0 | \ xargs -0 du | \ sort -nr | \ head -n 5 |
図9 for文を使ったシェルスクリプトの例
1 2 3 4 5 6 |
#!/usr/bin/bash four_seasons="春 夏 秋 冬" for season in $four_seasons do echo "$season" done |
図10 図8のシェルスクリプトをfor文を使って書き換えた例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/usr/bin/bash if [ $# -eq 0 ] then echo “エラー: 引数でディレクトリを指定してください” exit 1 fi size="1M" for dir in "$@" do if [ ! -d “$dir” ] then echo "エラー: ${dir}が見つかりません" else echo "--「${dir}」以下にある${size}バイト以上のファイル--" find $dir -type f -size "+${size}" -print0 | \ xargs -0 du | \ sort -nr | \ head -n 5 fi done |
図12 配列を使ったシェルスクリプトの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/usr/bin/bash if [ $# -eq 0 ] || [ ! -d $1 ] then echo "エラー: 引数でディレクトリを指定してください" exit 1 fi target=~/公開/pictures extensions=(jpg jpeg png gif pdf) for ext in "${extensions[@]}" do for file in "$1"/*.${ext} do if [ -f "$file" ] then cp -v "$file" $target fi done done |