从逗号分隔的字符串传递值并分配给 korn shell 中的不同变量

Passing values from comma seperated string and assigning to different variables in korn shell

我正在将 SQL 查询的结果作为逗号分隔字符串导出到变量。如何将字符串中的每个值分配给变量名并导出。

$SQLOUTPUT_STRING=1,2018-05-16,abc,123

我想将上述字符串中的值赋给变量并导出它们

export VAR1=1
export VAR2=2018-05-16
export VAR3=abc
export VAR4=123

我在其他脚本中使用这些变量,所以我不能像上面那样命名这些泛型,所以 VAR1、VAR2、VAR3、VAR4 不会是这种情况,它会是不同的名称。

提前致谢。

您可以在 shell 脚本中使用 cut 命令获取 CSV 文件的单个字段或整列,每次调用 cut 命令一个。 cut 期望通过标准输入提供输入的 CSV 数据,因此您可以使用 "here" 文档 shell 功能来呈现 SQLOUTPUT_STRING shell 的内容变量作为标准输入。

以下命令序列会将值 12018-05-16abc123 分配给 VAR1VAR2 ,分别为:

SQLOUTPUT_STRING=1,2018-05-16,abc,123

export VAR1=`cut -d, -f1 <<
$SQLOUTPUT_STRING
EOF
`
export VAR2=`cut -d, -f2 <<
$SQLOUTPUT_STRING
EOF
`
export VAR3=`cut -d, -f3 <<
$SQLOUTPUT_STRING
EOF
`
export VAR4=`cut -d, -f4 <<
$SQLOUTPUT_STRING
EOF
`

注意我使用了传统的 Bourne shell 反引号转义来使 shell 执行反引号中包含的命令并将其输出用作文字替换值以在 [= 中就地扩展21=] 声明,因为您特别要求可移植 shell 代码。现代 ksh shell 语法中可能存在替代语法和重定向运算符。

让我们再试一次...假设您的数据中没有嵌入逗号,您可以使用 read 命令的变体将字符串拆分到您的变量列表中。

为了显示此解决方案处理嵌入的白色 space 我们将从您的示例字符串的修改版本开始:

$ input="1,2018-05-16,abc def,asdf 123"

我们现在告诉 read 使用逗号作为输入字段分隔符 (IFS),我们将使用此处字符串将 ${input} 传递给 read ,这给了我们:

$ IFS=, read -r VAR1 VAR2 VAR3 VAR4 <<< "${input}"

$ echo "${VAR1}"
1

$ echo "${VAR2}"
2018-05-16

$ echo "${VAR3}"
abc def

$ echo "${VAR4}"
asdf 123

这应该比我之前基于参数替换的答案(下面)快一点 *加上* 你不会破坏 ${input}.

的内容

这里有一个 bash fiddle for the above solution, and a ksh93 fiddle 显示相同的解决方案。


我之前的answer/ramblings ...

如果您可以使用数组,运行 在 "bash split string into array" 上搜索,您应该会得到几个 SO 命中来帮助您。

如果您绝对肯定需要使用单个变量,我可能会使用参数替换来删除字段。

${variable%%,*}      # strip off the first field of a comma-delimited string
${variable#*,}       # strip off fields 2-n of a comma-delimeted string

将此应用于您的示例字符串,我们得到:

$ input="1,2018-05-16,abc,123"

$ VAR1="${input%%,*}"    input="${input#*,}"
$ VAR2="${input%%,*}"    input="${input#*,}"
$ VAR3="${input%%,*}"    input="${input#*,}"
$ VAR4="${input%%,*}"    input="${input#*,}"

$ echo "${VAR1}"
1

$ echo "${VAR2}"
2018-05-16

$ echo "${VAR3}"
abc

$ echo "${VAR4}"
123
  • 每个连续的 VAR= / input= 对将前导字段放入 VAR 并更新 input 以包含其余字段
  • 如果您需要在 input 中保留原始值,那么首先将 input 复制到另一个您可以拆分的变量中

虽然这看起来比使用 cutawk 去除字段要多一些编程,但主要好处是您不需要生成新的子-process(就像你对 cutawk 解决方案所做的那样)所以你应该发现性能得到了提高(并且对于大量输入字符串处理,性能提高应该非常明显)。

显然(?)如果您处理的数据 a) 包含逗号,b) 跨越多行 and/or c) 包含 non-printing/control 个字符,这可能会变得有点复杂。 .