2つのbashスクリプトの組み合わせとメニューの使用

2つのbashスクリプトの組み合わせとメニューの使用

2つのスクリプトがあります。 1つはcsvファイルを含むフォルダ用、もう1つは.tar.gzファイルを含むフォルダ用です。 2番目のスクリプトでは、操作を実行する前にまずファイルを解凍します。これで、これら2つのスクリプトを、使用したいフォルダを指定できる1つのスクリプトにまとめたいと思います。スクリプトを実行すると、ユーザーはフォルダAまたはフォルダBを使用する2つの選択肢があります。一種のメニューのようです。

スクリプトA

#!/bin/bash
FOLDER=/path/to/folder
DATE_LOG=`date "+%Y-%m-%d-%H:%M:%S"`
LOG_FILE=/home/kamil/Desktop/Script/log_$DATE_LOG.txt


# Getting the pattern and headers of files from FOLDER
cd "$FOLDER"
    for file in *.csv; do
    echo -n "${file}" "|" | sed -r 's/(.*)_[0-9]{8}_[0-9][0-9]-[0-9][0-9].[0-9][0-9].csv/\1/'
        head -1 "$file"
    done | tee $LOG_FILE

スクリプトB

#!/bin/bash
FOLDER_HISTO=/path/to/folder/WithTAR.GZ
DATE_LOG=`date "+%Y-%m-%d-%H:%M:%S"`
LOG_FILE=/home/kamil/Desktop/Script/log_$DATE_LOG.txt


# Getting the pattern and headers of files from FOLDER_HISTO
cd "$FOLDER_HISTO"
    for zip_file in *.tar.gz; do
    file=`tar -xvf $zip_file`
    echo -n "${file}" "|" | sed -r 's/(.*)_[0-9]{8}_[0-9][0-9]-[0-9][0-9].[0-9][0-9].csv/\1/'
        head -1 "$file"
    done | tee $LOG_FILE 

答え1

メニューを作成する標準CLI方式は次のとおりですselect

select response in "Folder 1" "Folder 2"
do
    case $response in
        "Folder 1") cd folder1; /path/to/ScriptA.sh; exit ;;
        "Folder 2") cd folder2; /path/to/ScriptB.sh; exit ;;
    esac
done

答え2

スクリプトは非常に似ているので、1つのスクリプトにまとめます。 2つの引数、つまりファイル拡張方法のオプションまたは-tar表示-csvと、拡張位置を示すディレクトリ名を使用しますcd

MODE=$1
FOLDER=$2
DATE_LOG=`date "+%Y-%m-%d-%H:%M:%S"`
LOG_FILE=/home/kamil/Desktop/Script/log_$DATE_LOG.txt

case "$mode" in 
    -tar) SUFFIX=tar.gz
          CMD="tar -xvf" 
        ;;
    -csv) SUFFIX=csv
          CMD="cat" 
        ;;
    *) echo Invalid mode "$mode" >&2; exit 1 ;;
esac

if ! cd "$FOLDER"
then echo "Bad folder $FOLDER" >&2
     exit 1
fi
for file in *.SUFFIX; do
    contents=`$CMD $file`
    echo -n "$contents" "|" | sed -r 's/(.*)_[0-9]{8}_[0-9][0-9]-[0-9][0-9].[0-9][0-9].csv/\1/'
    head -1 "$contents"
done | tee $LOG_FILE

ループで実行されている操作がfor正しくないように見え、コピーのバグに近いと思われます。実際に行っていることを上記の構造に合わせる方法を理解できることを願っています。一般的なアイデアは、両方のスクリプトでさまざまな場所を見つけて、ステートメントで設定された変数に入れることですcase。私のように、単純な変数置換だけですべてのことを行うことはできないかもしれません。ifステートメントが必要な場合があります。

これは…乾いた原則として。

パターンによってフォルダが常に同じ場合は、コマンドラインから要求するのではなく、FOLDERステートメントに割り当てを配置できます。casemuruの回答に示すように、コマンドラインオプションをメニューに置き換えることもできます。

関連情報