如何在 shell 中遍历多个逗号分隔的字符串

How to loop through multiple comma separated strings in shell

我正在尝试遍历多个以逗号分隔的字符串,字符串中的逗号数量相同。

我已经尝试了下面的代码片段,但它 return 没有任何效果。

#!/bin/bash
    
ip1=“Ok1,ok2,ok3”
    
ip2=“ty1,ty2,ty3”
    
for i in ${ip[@]//,/} 
do 
        echo $i 
done

有人可以建议我如何更改它。

修复:

  1. ip更改为ip1ip2
  2. 将智能引号更改为常规引号:"
  3. 在最后的 /
  4. 之后添加一个 space,用 spaces 替换逗号
ip1="Ok1,ok2,ok3"
ip2="ty1,ty2,ty3"
    
for i in ${ip1//,/ }
do 
        echo "$i"
done

最好用数组,这样项目自然分开,你就不用做任何字符串操作了。

ip1=(Ok1 ok2 ok3)
ip2=(ty1 ty2 ty3)
    
for i in "${ip1[@]}"
do 
        echo "$i"
done

尽快用数组替换 comma-separated 字符串。如果它是一个 hard-coded 字符串,那是微不足道的:

ip1=(Ok1 ok2 ok3)

如果它来自外部来源(例如,command-line 参数或从文件中读取),请使用 read:

ip1s="Ok1,ok2,ok3"
IFS=, read -a ip1 <<< "$ips1"

一旦有了数组,就可以使用数组语法进行迭代:

for i in "${ip1[@]}"; do
    echo "$i"
done

如果您有多个数组要同步迭代,您可以迭代数组的键:

for i in "${!ip1[@]}"; do
  echo "${ip1[i]}"
  echo "${ip2[i]}"
done

(这忽略了稀疏数组的可能性,但您必须努力获得这些数组。实际上,具有 n 元素的数组通常具有键 0、1、... n- 1.)