シェルスクリプトマガジン

Bash入門(Vol.83記載)

著者:大津 真

LinuxやmacOSなど、UNIX系OSのコマンドラインで使用されるコマンドインタプリタをシェルと呼びます。本連載では高機能シェルとして人気の高い「Bash」の基本操作について説明していきます。最終回となる今回は、シェルで実行可能なプログラミング言語である「シェルスクリプト」について解説します。

シェルスクリプトマガジン Vol.83は以下のリンク先でご購入できます。

図2 図1のコマンド行と同様の処理をするシェルスクリプトの例

# サイズの大きなファイルを見つける
echo "--「~/ピクチャ」以下にある1Mバイト以上のファイル--"
find ~/ピクチャ -type f -size +1M -print0 | \ 
  xargs -0 du | \
  sort -nr | \
  head -n 5

図5 図2のシェルスクリプトを変数を使うように書き換えた例

#!/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のシェルスクリプトをコマンドライン引数を参照するように書き換えた例

#!/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文を使用したシェルスクリプトの例

#!/usr/bin/bash
if cd $1 2>/dev/null
then
  echo "${1}に移動しました"
else
  echo "${1}に移動できませんでした"
fi

図8 図6のシェルスクリプトを条件式とif文を使って書き換えた例

#!/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文を使ったシェルスクリプトの例

#!/usr/bin/bash
four_seasons="春 夏 秋 冬"
for season in $four_seasons
do
    echo "$season"
done

図10 図8のシェルスクリプトをfor文を使って書き換えた例

#!/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 配列を使ったシェルスクリプトの例

#!/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