※当サイトの記事には、広告・プロモーションが含まれます。

シェルスクリプトで日付のフォーマットだけ変数に格納したい

japan.zdnet.com

 GitHub Innovation Graphは、gitプッシュ、言語、エコノミーコラボレーターなど、グローバルな開発者の活動に関するデータを可視化したもの。2020年からのローデータをメトリックや経済圏ごとにダウンロード可能にしている。政策立案者や研究者がGitHubプラットフォーム上で1億人以上の開発者が生成したデータにアクセスし、政策立案やグローバル開発および研究に向けた有益な情報の提供を目指すものだという。

GitHub、「GitHub Innovation Graph」公開--日本からは247万人以上が開発に関与 - ZDNET Japan

 世界全体で見た使用プログラミング言語のトップ3は「JavaScript」「Python」「Shell」だった。この順位は、2020年第1四半期から変わっておらず、2023年第1四半期では「Java」「TypeScript」が続いている。日本でのトップ3はJavaScript、Shell、Pythonという結果だった

GitHub、「GitHub Innovation Graph」公開--日本からは247万人以上が開発に関与 - ZDNET Japan

GitHubを利用していない環境とかの情報は収集できないと思うのだけど、サンプルとしては十分ということなのかね?

動的型付け言語が上位を独占しとりますな...

シェルスクリプトで日付のフォーマットだけ変数に格納したい

ネットでググっても出て来なかったので、自力で実装してみました。

以下のようになりました。

■/home/ts0818/work/test_date/date_result.sh

#! /bin/bash

# set -e を追加
set -e

result_log="result.log"

fmt="+%Y/%m/%d %H:%M:%S.%3N"

# 処理開始
echo "【start】〇〇の処理を開始します。" >> $result_log
date "$fmt" >> $result_log

row_count=0
not_already_tbody_flg=true
# CSVファイル読み込み
while read row; do

  # コマンド置換の結果を変数に代入
  col_count=$(echo ${row} | awk -F ',' '{print NF}')
  
  # tableヘッダーの場合
  if [ $row_count -eq 0 ]; then
    echo "<table><thead>" >>  ${result_log}
  fi
  
  # tableボディの開始行の場合
  if [ $row_count -eq 1 ] && [ ${not_already_tbody_flg} ]; then
    echo "<tbody>" >>  ${result_log}
    not_already_tbody_flg=false
  fi
  
  echo "<tr>" >>  ${result_log}
  
  for index in `seq 1 ${col_count}`
  do

    # 1行毎の各列を取得
    column=$(echo ${row} | cut -d ',' -f ${index})
    
    # ヘッダー
    if [ $row_count -eq 0 ]; then
      cat <<EOF >> ${result_log}
      <th>${column}</th>
EOF
    else
      cat <<EOF >> ${result_log}
      <td>${column}</td>
EOF
    fi
  done
  
  echo "</tr>" >> ${result_log}
  if [ $row_count -eq 0 ]; then
    echo "</thead>" >>  ${result_log}
  fi

  # 行数(let コマンドを使って算術演算)
  row_count=`expr $row_count + 1`
  
done < pokemon.csv

echo "</tbody></table>" >> ${result_log}

# 処理終了
echo "【finish】〇〇の処理を終了します。" >> $result_log
date "$fmt" >> $result_log

⇧ ポイントは、変数をダブルクォーテーションで囲ってあげるところでしょうか。

dateコマンドも含めて変数に格納している情報は多いんだけど、dateコマンドは毎回実行するようにして日時を変えることで、実行時間を算出したかったというわけで、日付のフォーマットだけ変数に格納したというわけです。

今回も、シェルスクリプトを実行する環境は、「WSL 2(Windows Subsystem for Linux 2)」のUbuntu環境です。

読み込むCSVファイルは、

pokemon.csv · GitHub

⇧ 上記のGitHubで公開されてるものを利用させていただきました。

以下のディレクトリにシェルスクリプトのファイルとCSVファイルを配置して、

コマンドプロンプトを起ち上げて、「WSL 2(Windows Subsystem for Linux 2)」のUbuntu環境へSSHログイン。

シェルスクリプトのファイルを実行します。

result.logファイルが作成されていればOK。

 

【start】〇〇の処理を開始します。
2023/09/25 21:22:20.608
<table><thead>
<tr>
      <th>#</th>
      <th>Name</th>
      <th>Type 1</th>
      <th>Type 2</th>
      <th>Total</th>
      <th>HP</th>
      <th>Attack</th>
      <th>Defense</th>
      <th>Sp. Atk</th>
      <th>Sp. Def</th>
      <th>Speed</th>
      <th>Generation</th>
      <th>Legendary</th>
</tr>
</thead>
<tbody>
<tr>
      <td>1</td>
      <td>Bulbasaur</td>
      <td>Grass</td>
      <td>Poison</td>
      <td>318</td>
      <td>45</td>
      <td>49</td>
      <td>49</td>
      <td>65</td>
      <td>65</td>
      <td>45</td>
      <td>1</td>
      <td>False</td>
</tr>

...省略

<tr>
      <td>720</td>
      <td>HoopaHoopa Unbound</td>
      <td>Psychic</td>
      <td>Dark</td>
      <td>680</td>
      <td>80</td>
      <td>160</td>
      <td>60</td>
      <td>170</td>
      <td>130</td>
      <td>80</td>
      <td>6</td>
      <td>True</td>
</tr>
<tr>
      <td>721</td>
      <td>Volcanion</td>
      <td>Fire</td>
      <td>Water</td>
      <td>600</td>
      <td>80</td>
      <td>110</td>
      <td>120</td>
      <td>130</td>
      <td>90</td>
      <td>70</td>
      <td>6</td>
      <td>True</td>
</tr>
</tbody></table>
【finish】〇〇の処理を終了します。
2023/09/25 21:23:17.523

⇧ 処理の開始日時と終了日時が出力されてます。

業務時間中に日付のフォーマットだけ変数に格納するやり方が見つからず、日付のフォーマットを変数に格納せずべた書きしてしまって、業務後に目的の方法が見つかったのだけど、シェルスクリプトの書き方を探すのが、なかなかに大変ですな...

毎度モヤモヤ感が半端ない...

今回はこのへんで。