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

如何在shell脚本中循环逗号分隔的值,shell,ksh,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 首先,将值更改为数组。然后迭代它是一件简单的事情 values

我尝试用空格循环逗号分隔的值,但无法得到确切的值,因为字符串中有空格

我尝试了不同的方法,但没有得到想要的结果。 有人能帮我吗

#!/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

首先,将
值更改为数组。然后迭代它是一件简单的事情

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

首先,将
值更改为数组。然后迭代它是一件简单的事情

values=(A "sample text" Mark)
for i in "${values[@]}"; do
  echo "$i"
done
这与使用OP的精确
$values
赋值相同,只有kludgier,()和更危险的(
eval
..),才能更好地使用OP的精确
$values
赋值:

values="('A','sample text','Mark')"
eval values=${values//,/ }
for i in "${values[@]}"; do
  echo "$i"
done
它适用于
ksh
,但实际上,如果可能的话,尝试使用Chepner的更简单、更安全的
$values
赋值。

这与使用OP的精确
$values
赋值相同,只有kludgier,(),且更危险(the
eval
…),使用OP的精确
$values
赋值更好:

values="('A','sample text','Mark')"
eval values=${values//,/ }
for i in "${values[@]}"; do
  echo "$i"
done
它适用于
ksh
,但实际上,如果可能的话,尝试使用Chepner更简单、更安全的
$values
赋值。

只需修剪引号即可

#!/bin/ksh

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

A
sample text
Mark
只需删减引号

#!/bin/ksh

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

A
sample text
Mark

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

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

sed“s/[)(]///g;s/','/\n/g;s/'///g“您应该使用单引号来拆分字符串(并引用
“$values”
)。
当您的
sed
支持将
\n
替换为一行时,您可以不使用循环:

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

sed“s/[)(]//g;s/','/\n/g;s/'///g“除非您从其他地方获取
值,否则应将其设置为常规数组:
值=(一个“示例文本”标记)
。如果您从其他地方获取,请让他们发送一种更容易解析的格式,如JSON。您的值不是逗号分隔的。它是一个文本字符串,还包含“and(and)”和,除非您从其他地方获取
值,否则应将其设置为常规数组:
值=(一个“示例文本”标记)
。如果您是从其他地方获取的,请让他们发送一种更容易解析的格式,如JSON。您的值不是逗号分隔的。它是一个文本字符串,还包含“和(和)”和“如何更改为数组?值=('a','sample text','Mark')如何将此逗号分隔的值转换为数组?请丢失逗号
值=('A''示例文本''Mark')
@Gowtham您当前的值是一个字符串,看起来是一个带有逗号的数组。此答案使用数组赋值语法(注意缺少引号;
A=(…)
是一种特殊的赋值。)我无法使用此单引号值values=('A''示例文本''Mark')循环。如何循环此值?如何更改为数组?values=('A','sample text','Mark')如何将此逗号分隔的值转换为数组?丢失逗号
值=('A''示例文本''Mark'))
@Gowtham您当前的值是一个字符串,看起来像是一个带逗号的数组。此答案使用数组赋值语法(注意缺少引号;
a=(…)
是一种特殊的赋值形式。)我无法循环使用此单引号值=('a''示例文本''Mark')。如何循环此操作?