Bash 菜单将根据用户是否传递了参数来执行不同的脚本

Bash 菜单将根据用户是否传递了参数来执行不同的脚本

我问过StackOverflow 上的这个问题昨天,把它弄得一团糟,而且由于我对 Linux 缺乏了解,通常浪费了人们的时间。

希望我现在能做得更好。我尝试了很多不同的方式来解决这个问题,但最终只是让这里的人们对我真正需要的东西感到困惑。

我需要制作一个脚本,根据用户是否传递了任何参数来调用其他子菜单脚本。如果参数是“help”,我需要清除屏幕并显示一条短消息,告诉用户如何使用帮助命令。否则,脚本将显示相应的子菜单

其他参数是“文件”“文本”“状态”,如果使用它们将调用专家脚本,否则它将从用户菜单调用新手脚本。

我创建了总共 6 个其他脚本占位符的模型,名为 fileExpert、fileNovice、textExpert、textNovice 等,我想根据用户是否传递了某些参数的条件来执行这些占位符。

到目前为止,根据我的研究,我知道我需要设置一个类似的条件测试, if $>0 then go into expert or if there are no arguments execute novice 除此之外我完全迷失了。

希望这听起来不像是完全胡说八道,而且有一定道理。

答案1

希望这里的逻辑没问题,您可以使用短版本和长版本:

测试用例 :

./Main.sh  ## Error
./Main.sh -i Text ## Expert 
./Main.sh -i dummy ## Novice
./Main.sh -i File foobar ## Error
./Main.sh -i ## Error 
./Main.sh -h ## Help

主要.sh:

#!/bin/bash

usage="############################ HELP ############################
Main.sh [-h] [-i input] -- call submenus

Where:
    -h,--help  :  Show this helper
    -i,--input :  Could be either File | Text | Status\n"
    
unset -v INPUT
err=false
POS=()
while [[ $# -gt 0 ]]
do
opt="$1"

case $opt in
    -i|--input)
    INPUT="$2" 
    if [ -z "${INPUT}" ]; then 
        echo "Syntax Error : Argument for ${opt} cannot be empty "
        printf "$usage"
        exit 1
    fi
    shift 2
    ;;
    -h|--help)
    printf "$usage"
    echo -e "\r"
    exit 0
    ;;
    *)    
    POS+=("$1") 
    shift
    err=true
    echo "Syntax Error : Additional argument not used"
    printf "$usage"
    exit 1
    ;;
esac
done
set -- "${POS[@]}"

## Your logic here
if [ -z "${INPUT}" ] && [ "${err}" = false ] ; then
        echo "Syntax Error : -i option is necessary"
        printf "$usage"
        exit 1
elif  [ -z "${INPUT}" ] && [ "${err}" = true ]  ; then
        echo "Syntax Error : -i option is necessary"
        exit 1
elif [ "${INPUT}" == "File" ] || [ "${INPUT}" == "Text" ] || [ "${INPUT}" == "Status" ] ; then
    # call Expert scripts
    <path_to_fileExpert> 
    <path_to_textExpert>
    exit 0
else
    # call Novice scripts
    <path_to_fileNovice>
    <path_to_textNovice>
    exit 0
fi 

相关内容