【Shell】実行時にファイル名を指定し、tar.gzまたはzipファイルを展開する

■実装するプログラムの概要

実行時に指定したファイル名を基に、tar.gz形式またはzip形式の場合は、圧縮ファイルを展開する。

■フローチャート

■プログラム仕様

インプット処理内容アウトプット
実行ファイル名を変数にセットする。
【第1引数】
ファイル名を指定
第1引数の値を変数にセットする。
【ファイル名】
圧縮ファイル名
*.tar.gz
*.zip
【条件分岐】
第1引数について
(1)*.tar.gzの場合:
tarコマンドでファイルを展開する。
(2)*.zipの場合:
unzipコマンドでファイルを展開する。
(3)上記以外:
エラーメッセージを出力する。
【展開】
ファイル
or
ディレクトリ

【メッセージ】
エラーメッセージ

■ディレクトリ構造

同一階層に実行モジュール「sample.sh」と圧縮ファイル「sample.tar.gz」および「sample.zip」配置する。

なお、今回使用する圧縮ファイルは、以下の処理で作成した「work」ディレクトリを圧縮したものを使用する。

■サンプルコード

#!/bin/bash

# 実行ファイル名をセット(パスは削除)
readonly MODULE_NAME=${0##*/}

# 第1引数を変数にセット(展開対象ファイル)
input_file=$1

# 展開判定処理
#   展開対象:tar.gz/zip
#   上記以外:エラーメッセージ出力
case "$input_file" in
    *.tar.gz)
        printf '%s\n' "${MODULE_NAME}:tar.gz形式を展開します。"
        tar -xzf "$input_file"
        ls ./work
        ;;
    *.zip)
        printf '%s\n' "${MODULE_NAME}:zip形式を展開します。"
        unzip -q -- "$input_file"
        ls ./work
        ;;
    *)
        printf '%s\n' "${MODULE_NAME}:エラーが発生しました。"
        printf '%s\n' "指定した引数:${input_file}"
        ;;
esac

■実行結果

・tar.gzファイルを展開

$ ./sample.sh  sample.tar.gz
sample.sh:tar.gz形式を展開します。
samplefile1.txt	samplefile2.txt	samplefile3.txt

・zip形式で圧縮

$ ./sample.sh  sample.zip
sample.sh:zip形式を展開します。
samplefile1.txt	samplefile2.txt	samplefile3.txt

・エラーメッセージ出力(実行時の第1引数:0、1以外)

$ ./sample.sh  aaa
sample.sh:エラーが発生しました。
指定した引数:aaa
タイトルとURLをコピーしました