Shell脚本传参使用正确方法(Shell脚本传参数)

目录

实例(test.sh) 

结果


实例(test.sh) 

#!/bin/sh


declare -i win_count=0
declare -i lin_count=0


function help()
{
    echo -e "\033[36;1mhelp:\033[0m"
    echo -e "\033[36;1m    --win(-W) :   Windows Number of Windows VMS(eg: -W 2 or --win 2)\033[0m"
    echo -e "\033[36;1m    --Lin(-L) :   Linux Number of Linux VMS(eg: -L 2 or --lin 2)\033[0m"
    echo -e "\033[36;1m    --help(-h):   display this help and exit \033[0m"
}

function isLegal()
{
    machine_num=$1
    if [ $machine_num -eq 0 ]; then
        echo "[-] Parameters of illegal !!"
        help
        exit 1
    fi
}

if [[ $1 = "--help" ]] || [[ $1 = "-h" ]]; then                                                                                                          
    help
    exit 1
fi

if [ ! -n "$1" ]; then
    echo "[-] Parameters of illegal !"
    help
    exit 1
fi

while [ -n "$1" ]
do
    case "$1" in
        --win) win_count=$2
            shift
            ;;
        -W) win_count=$2
            shift
            ;;
        --lin) lin_count=$2
            shift
            ;;
        -L) lin_count=$2
            shift
            ;;
        *) echo "[-] Parameters of illegal !!!"
            help
            exit 1
            ;;
    esac
    shift
done

isLegal $win_count
isLegal $lin_count

echo $win_count --- $lin_count

结果

<think>好的,我需要解决用户在DolphinScheduler中运行Shell脚本时如何参数的问题。首先,我得回忆一下DolphinScheduler的基本机制。用户提到在日志中发现节点之间传参不一致,比如shell-nodeA输出当天日期,而其他节点输出前一天日期,这可能是因为参数递方式不正确导致的。 根据引用[4],工作流传参的问题可能与参数的作用域或递方式有关。DolphinScheduler支持参数递,包括系统参数和自定义参数。用户可能没有正确设置参数的作用域或格式。系统参数如${system.biz.date}可能被正确使用,但自定义参数需要用户手动定义并在任务中引用。 接下来,我需要确认DolphinScheduler中参数方法。通常,在定义工作流时,可以在任务节点中通过${参数名}来引用参数。但要注意,参数的作用域分为全局和局部,如果参数在父节点定义,子节点需要正确继承。此外,Shell脚本内部如何接收这些参数也很关键,可能需要通过$1、$2等位置参数来获取。 然后,考虑到用户提供的日志示例,shell-nodeB和C可能没有正确接收到当天的日期参数,可能是因为在参数递时使用了不同的变量,或者在脚本中未正确引用。需要指导用户如何在任务配置中添加参数,并确保Shell脚本正确使用这些参数。 另外,引用[1]提到DS对Shell脚本的控制力有限,可能没有深度集成,所以在传参时需要显式地将参数递给脚本,比如在命令部分写明参数。例如,在Shell任务的命令框中,不仅要写脚本路径,还要添加参数变量,如sh script.sh ${参数}。 还需要提醒用户注意参数的类型和格式,比如日期参数可能需要特定的格式,或者自定义参数需要正确的作用域设置。同时,测试工作流时,查看日志确认递的值是否符合预期,这有助于排查问题。 最后,总结步骤:定义参数(系统或自定义)、在Shell任务中引用参数脚本内部处理参数、验证日志。同时,可能遇到的问题包括作用域错误、格式问题或脚本接收参数的方式不正确,需要逐一检查。</think>在 DolphinScheduler 中向 Shell 脚本参数时,可通过以下步骤实现: --- ### 1. **参数定义** - **系统参数**:直接使用内置变量如 `${system.biz.date}`(基准日期,格式 `yyyyMMdd`) - **自定义参数**: 1. 在工作流定义界面点击「全局参数」 2. 添加参数,例如: - 参数名称:`my_param` - 参数值:`$(date +%Y-%m-%d)` 或固定值 - 类型:`VARCHAR`/`DATE` 等 --- ### 2. **Shell 任务中引用参数** 在 Shell 节点编辑界面: ```shell #!/bin/bash echo "系统日期: ${system.biz.date}" echo "自定义参数: ${my_param}" # 脚本接收参数示例 sh your_script.sh ${my_param} ${system.biz.date} ``` *注意:若脚本内部需用`$1`获取参数,需在命令中显式递[^4]* --- ### 3. **脚本内部接收参数** 示例脚本 `your_script.sh`: ```bash #!/bin/bash param1=$1 # 接收第一个参数 param2=$2 # 接收第二个参数 echo "接收参数1: $param1" echo "接收参数2: $param2" ``` --- ### 4. **验证参数递** 1. 运行工作流后,点击任务实例右侧「查看日志」 2. 检查日志输出是否符合预期: - 若出现日期不一致(如某节点显示前一天日期),需确认参数是否被覆盖或作用域错误[^4] --- ### 最佳实践 1. **参数作用域**:全局参数对所有节点生效,局部参数仅在定义节点生效 2. **日期格式转换**: ```shell # 将 yyyyMMdd 转为 yyyy-MM-dd formatted_date=${system.biz.date:0:4}-${system.biz.date:4:2}-${system.biz.date:6:2} ``` 3. **参数回显**:在脚本开头添加 `echo "参数列表: $@"` 调试参数---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨痕诉清风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值