Yanonoblog!

こつこつと

シェルスクリプトの構文や活用例を深ぼる

はじめに

多少は実践的にLinux使えるようになりたいと思い書籍「新しいLinuxの教科書」を読み進めています。

本記事では「新しいLinuxの教科書」で学んだ内容と別途気になって調べた内容や知識も含めアウトプットしていきます。

前回の記事の続きとなっております。

シェルスクリプトの基本 - 改行、引数、変数、条件式など

シェルスクリプトで日記の作成、ディレクトリ管理

以下はホームディレクトリ配下の「diary」というディレクトリに日記ファイルを作成するシェルスクリプトです。

スクリプトの概要

日付の割り振りやディレクトリ管理をコマンドで自動的に割り振りされるように出来るため、フローを効率化することができています。

# 実行 (diary シェルスクリプトを実行)
. ./diary.sh

# --スクリプトによりvimの編集画面に移動し編集--

# 結果 
本日分のファイルを作成しました: 2023-04-17.txt

スクリプトの実行ファイル

diary.shシェルスクリプトを実行すると**$(date '+%Y-%m-%d').txtでファイルを指定してvimで作成・編集するコマンド**を呼び出します。 diaryディレクトリが存在しなければdiaryディレクトリを作成して、その上でファイルを配置、日記ファイルがなければ日付を挿入したファイルを作成するようになっております。

#!/bin/bash

DIARY_DIR="$HOME/diary"
DIARY_FILE="$DIARY_DIR/$(date '+%Y-%m-%d').txt"

# Create diary directory if it doesn't exist
if [ ! -d "$DIARY_DIR" ]; then
  mkdir "$DIARY_DIR"
fi

# Create new diary file if it doesn't exist
if [ ! -e "$DIARY_FILE" ]; then
  echo "Creating new diary file: $DIARY_FILE"
  echo "$(date '+%Y-%m-%d')" > "$DIARY_FILE"
fi

vim "$DIARY_FILE"
補足 - dateコマンド

現在の日付や時間を表示するためのコマンドです。

date コマンドには様々なオプションがありますが、ここでは '+%Y-%m-%d' オプションが使用されています。

日付を YYYY-MM-DD 形式で表示することができます。

# 実行
date '+%Y-%m-%d'

# 結果
2023-04-17
補足 - if文

指定されたパス**$DIARY_FILEにファイルやディレクトリが存在しない場合に実行**される条件式です。

-eオプションを使って、指定されたパスにファイルやディレクトリが存在するかどうかをチェックしています。

!を使ってその結果を反転させ$DIARY_FILEにファイルやディレクトリが存在しない場合に真を返します。

# 実行
if [ ! -e "$DIARY_FILE" ];

指定したパス配下のファイル一覧を表示するシェルスクリプト

指定したディレクトリ配下のファイルやディレクトリを一覧表示するシェルスクリプトです。

これはもう少し改良したら便利かもしれません。

# 実行
. ./tree.sh ~

# 結果
/shell_scripts
  /test_dir/
    /test.txt
  /tree.sh

list_recursive関数は、引数としてファイルパスとインデントを受け取ります。

filepathには、表示したいファイルが含まれるディレクトリのパスを格納し、indentには、ファイル名の前に挿入するインデントを格納します。

#!/bin/bash

list_recursive ()
{
  local filepath=$1
  local indent=$2

  # インデント付きで、パス部分を取り除いてファイル名を表示する
  echo "${indent}${filepath##*/}"

  if [ -d "$filepath" ]; then
    local fname
    for fname in $(ls "$filepath")
    do
      #インデントにスペーズを追加して再帰呼び出し
      list_recursive "${filepath}/${fname}" "    $indent"
    done
  fi
}

list_recursive "$1" ""
補足 - local変数

今回の例では関数内でのみ使用される変数を定義するためにlocal が使用されています。

local fname

変数を定義する場合は localをつけることが推奨されます。これにより、関数内でのみ使用される変数となり、関数から呼び出された場合でも、その変数の値が書き換えられてしまうことを防ぐことができます。

JavaScriptなどでは{}などのスコープ内でのみ変数が共有されますが、シェルではブロックの外にも影響があるため、グローバル変数としないようにlocal宣言を行うと良いでしょう。

補足 - パラメータ展開

パラメータ展開を使用することで、変数の値から必要な部分を削除することができます。

  # インデント付きで、パス部分を取り除いてファイル名を表示する
  echo "${indent}${filepath##*/}"

種類は主に以下などがあります。

パラメータ展開 説明
${変数名#パターン} 変数 $変数名 の値の先頭から、最短でマッチする パターン を削除する。
${変数名##パターン} 変数 $変数名 の値の先頭から、最長でマッチする パターン を削除する。
${変数名%パターン} 変数 $変数名 の値の末尾から、最短でマッチする パターン を削除する。
${変数名%%パターン} 変数 $変数名 の値の末尾から、最長でマッチする パターン を削除する。

続く…

コメント

本記事の内容は以上になります!

書籍の続きのアウトプットも随時更新したいと思います。


プログラミングスクールのご紹介 (卒業生より)**

お世話になったプログラミングスクールであるRUNTEQです♪

https://runteq.jp/r/ohtFwbjW

こちらのリンクを経由すると1万円引きになります。

RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。

もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。

https://twitter.com/outputky

参考