如何遍历Bash函数参数并获取对应位置值?含多服务执行场景
解决Bash函数遍历不定长参数的问题
我来帮你搞定这个需求!你想要写一个接收不定长参数的Bash函数,把每个参数单独传给nomad命令执行对吧?
你当前的循环只打印了参数的位置序号,是因为没正确获取对应位置的参数值。这里有两种靠谱的实现方式:
方法一:直接遍历所有位置参数(推荐)
Bash里的"$@"会展开成所有的位置参数,每个参数作为独立的元素,而且能完美处理带空格或特殊字符的参数。用这个写函数最简洁:
refresh() { # 遍历每个传入的服务名 for service in "$@"; do # 执行nomad命令,记得给变量加双引号! nomad "$service" done }
比如你执行refresh service1 service2,函数会依次执行nomad service1和nomad service2;如果有带空格的服务名,比如refresh "my service" test,也能正确执行nomad "my service",不会把空格当成参数分隔符。
方法二:修正你原来的C风格循环
如果你想保留原来的索引循环方式,可以用Bash的间接引用${!i}来获取第i个位置参数的值:
refresh() { for (( i=1; i <= $#; i++ )); do # 通过索引i获取对应的参数值 service=${!i} nomad "$service" done }
这里${!i}的作用是:当i=1时,它会替换成$1的值;i=2时替换成$2的值,以此类推,这样就能拿到每个位置的参数了。
重要提醒
不管用哪种方法,一定要用双引号把变量(比如"$service")包裹起来,否则如果服务名里包含空格、星号这类特殊字符,Bash会错误地解析它们,导致命令执行失败。
内容的提问来源于stack exchange,提问作者Prav
相关产品推荐
相关产品推荐

