如何在 shell 中使用 IFS="," 输出逗号分隔值

如何在 shell 中使用 IFS="," 输出逗号分隔值

我有一个小脚本,当使用 IFS 时,它不会给出逗号分隔的输出,但 IFS 是强制性的,因为我需要它来读取许多其他值。以下脚本的输出是odi_server1 odi_server2,但我需要它用逗号分隔。

#Script Starts
#!/bin/sh

IFS=","
odi_cluster=odi_server1,odi_server2;
echo $odi_cluster;

#Script Ends

电流输出=odi_server1 odi_server2

预期输出 =odi_server1,odi_server2

注意:-IFS=","是强制性的,因此不能删除它。

答案1

由于您$odi_cluster在对 的调用中使用不加引号的方式echo,因此 shell 会将变量的值拆分为也出现在 中的任何字符$IFS(然后对生成的单词执行文件名通配)。通常,$IFS包含一个空格、一个制表符和一个换行符,但您已将其重新设置为逗号。

如果变量的值是odi_server1,odi_server2and$IFS包含逗号,则此拆分会产生两个单词odi_server1and odi_server2。这些将echo作为两个单独的参数给出,echo实用程序将使用分隔空格输出它们。

为了避免 letIFS对输出产生任何影响,请防止 shell 通过引用扩展来分割变量的值:

echo "$odi_cluster"

或者

printf '%s\n' "$odi_cluster"

有关的:

请注意,您可以通过调用以下命令IFS仅为read内置实用程序设置变量read

IFS=, read ...

这可以避免IFS为脚本的其余部分设置非默认值。

可能还相关:

另请注意,-行的字符#和必须是文件的第一个字符,并且不需要以 a 结束每个语句,除非同一行上还有其他语句。!#!;

相关内容