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
预期行为:
- 脚本是 运行:
sh script.sh dms_name
- 每个
dms_
变量都被填充
retry_cli
使用 3 个参数调用。当 $*_status
不是 success
字符串时,函数必须使用 aws cli
命令获取最新的 status
并重复它 returns success
- 转到第二个函数调用
我假设函数的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 可能希望提供有关该问题的更多详细信息(例如,循环永远不会退出,循环永远不会进入,???)。
我的脚本接受一个参数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
预期行为:
- 脚本是 运行:
sh script.sh dms_name
- 每个
dms_
变量都被填充 retry_cli
使用 3 个参数调用。当$*_status
不是success
字符串时,函数必须使用aws cli
命令获取最新的status
并重复它 returnssuccess
- 转到第二个函数调用
我假设函数的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 可能希望提供有关该问题的更多详细信息(例如,循环永远不会退出,循环永远不会进入,???)。