首页 > 解决方案 > bash while 从变量问题中读取循环参数

问题描述

我有一个带有以下变量的 bash 脚本:

operators_list=$'andrii,bogdan,eios,fre,kuz,pvm,sebastian,tester,tester2,vincent,ykosogon'

while IFS=, read -r tech_login; do


    echo "... $tech_login ..."

done <<< "$operators_list"

我需要从变量中读取参数并在循环中使用它们。但它只返回一次所有项目的回声:

+ IFS=,
+ read -r tech_login
+ echo '... andrii,bogdan,eios,fre,kuz,pvm,sebastian,tester,tester2,vincent,ykosogon ...'
... andrii,bogdan,eios,fre,kuz,pvm,sebastian,tester,tester2,vincent,ykosogon ...
+ IFS=,
+ read -r tech_login

我究竟做错了什么?如何重新编写脚本,使其每次只能使用一项?

标签: bashwhile-loopifs

解决方案


operators_list=$'andrii,bogdan,eios,fre,kuz,pvm,sebastian,tester,tester2,vincent,ykosogon'

所以你有用 . 分隔的字符串,。您可以通过多种方式做到这一点:

  1. 使用 bash 数组:

IFS=, read -a operators <<<$operators_list
for op in "${operators[@]}"; do
    echo "$op"
done
  1. 使用 while 循环,就像你想要的那样:

while IFS= read -d, -r op; do
    echo "$op"
done <<<$operators_list
  1. 使用 xargs,因为为什么不:

<<<$operators_list xargs -d, -n1 echo

IFS 和读取分隔符的事情是:read读取直到用-d. 然后 read读取了一个完整的字符串(通常是整行,因为默认分隔符是换行符)之后,然后使用分隔符将字符串拆分为多个部分IFS。这样你就可以:

while IFS=: read -d, -r op1 op2; do
    echo "$op1" "$op2"
done <<<"op11:op12,op12:op22"

推荐阅读