Shell/Bash - 脚本和函数冲突的位置参数

Shell/Bash - positional parameter for script and function colliding

我的脚本接受一个参数dms。一旦获得,它就会创建多个变量,用作 retry_cli 的参数。我遇到的问题是位置参数的使用。如何解决脚本创建变量并将其用作每个函数的参数的机制 运行?

目前看来函数使用的是触发脚本时注入的位置参数,而不是在其中创建的参数。 Documentation 表示两个 </code> 位置参数(对于脚本和函数)应该不是问题。</p> <pre><code>dms_name= aws_region="us-east-1" dms_arn=`aws dms describe-replication-tasks --filter Name=replication-task-id,Values="$dms_name" --query=ReplicationTasks[0].ReplicationTaskArn --output text --region "$aws_region"` ri_arn=`aws dms describe-replication-tasks --filter Name=replication-task-id,Values=$dms_name --query=ReplicationTasks[0].ReplicationInstanceArn --region "$aws_region"` target_arn=`aws dms describe-replication-tasks --filter Name=replication-task-id,Values=$dms_name --query=ReplicationTasks[0].TargetEndpointArn --region "$aws_region"` ri_status=`aws dms describe-connections --filter Name=replication-instance-arn,Values=$ri_arn --query=Connections[0].Status --region "$aws_region"` target_status=`aws dms describe-connections --filter Name=endpoint-arn,Values=$target_arn --query=Connections[0].Status --region "$aws_region"` retry_cli () { local max_retry=100 local counter=0 local sleep_seconds=15 local aws_region="us-east-1" until [[ =~ "success" ]] do status=`aws dms describe-connections --filter Name=,Values="" --query=Connections[0].Status --region "$aws_region"` [[ counter -eq $max_retry ]] && echo "connection status of failed!" && exit 1 ((counter++)) sleep $sleep_seconds done echo "connection for OK!" } retry_cli "$ri_status" replication-instance-arn "$ri_arn" retry_cli "$target_status" endpoint-arn "$target_arn" echo startting dms aws dms start-replication-task --replication-task-arn "$dms_arn" --start-replication-task-type resume-processing --region "$aws_region" echo done

预期行为:

  1. 脚本是 运行: sh script.sh dms_name
  2. 每个 dms_ 变量都被填充
  3. retry_cli 使用 3 个参数调用。当 $*_status 不是 success 字符串时,函数必须使用 aws cli 命令获取最新的 status 并重复它 returns success
  4. 转到第二个函数调用

假设函数的until循环正在重复运行一个命令,直到它收到包含字符串success.

对于第一遍,until 循环正在测试函数的第一个输入参数 (</code>) 中的字符串 <code>success.

随后通过 until 循环 仍然 测试字符串 success 的函数的第一个输入参数 (</code>)。</p> <p>我猜测对于后续的传递,您想要做的是测试字符串 <code>success 的最新 status;如果是这种情况,那么可能需要做一个小的代码更改:

retry_cli () {
    ...
    local status=""                           # new line
    until [[ "${status}" =~ "success" ]]        # modified line
    do
        ....
    done
    ...
}

如果这不能解决问题,那么 OP 可能希望提供有关该问题的更多详细信息(例如,循环永远不会退出,循环永远不会进入,???)。