如何在Shell脚本中循环逗号分隔的值

时间:2019-02-13 13:18:45

标签: shell ksh

我试图用空格循环逗号分隔的值,但是由于字符串中有空格,所以无法获得确切的值。

我尝试了不同的方法,但无法获得预期的结果。 有人可以帮我吗

#!/bin/ksh

values="('A','sample text','Mark')"

for i in `echo $values | sed 's/[)(]//g' | sed 's/,/ /g'`
do
  echo $i
done

我的预期输出是:

A
sample text
Mark

4 个答案:

答案 0 :(得分:2)

首先,将values更改为数组。然后遍历它很简单。

values=(A "sample text" Mark)
for i in "${values[@]}"; do
  echo "$i"
done

答案 1 :(得分:1)

只需修剪引号

#!/bin/ksh

values="('A','sample text','Mark')"
echo $values |  tr  -d "()'\"" | tr ',' '\n'

输出:

A
sample text
Mark

答案 2 :(得分:0)

这与Chepner's answer相同,只是kludgier(variable substitution),更危险的(eval ...),使用OP精确的{{ 1}}作业:

$values

它可以在values="('A','sample text','Mark')" eval values=${values//,/ } for i in "${values[@]}"; do echo "$i" done 中工作,但是实际上,如果有可能,请尝试使用 Chepner的更简单,更安全的ksh分配。

答案 3 :(得分:0)

您应使用单引号将字符串分割(并用引号"$values")。
当您的sed支持\n替换为一行时,您可以不使用循环:

echo "${values}" | sed "s/[)(]//g;s/','/\n/g;s/'//g"
# or
sed "s/[)(]//g;s/','/\n/g;s/'//g" <<< "${values}"

当字符串中的值不带逗号和括号时,可以使用

grep -Eo "[^',()]*" <<< "${values}"

更好的是在2个单引号之间寻找字段,并删除这些单引号。

grep -Eo "'[^']*'" <<< "${values}" | tr -d "'"