组合两个 bash 脚本并使用菜单

组合两个 bash 脚本并使用菜单

我有两个脚本,一个用于包含 csv 文件的文件夹,另一个用于包含 .tar.gz 文件的文件夹。在第二个脚本中,我首先解压缩文件,然后再对它们进行任何操作。现在我想将这两个脚本合并为一个脚本,用户可以在其中指定他/她想要使用的文件夹。运行脚本时,用户有两个选择:使用folderA 或folderB。有点像菜单。

脚本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

这些脚本非常相似,我会将它们合并为一个脚本。它需要两个参数:一个选项-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还需要一个语句。

这被称为干燥原则。

如果根据模式,文件夹始终相同,您可以将分配放入语句FOLDERcase,而不是在命令行上要求它。您还可以将命令行选项替换为菜单,如 muru 的答案所示。

相关内容