从逗号分隔的字符串传递值并分配给 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 的内容变量作为标准输入。
以下命令序列会将值 1
、2018-05-16
、abc
和 123
分配给 VAR1
到 VAR2
,分别为:
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
复制到另一个您可以拆分的变量中
虽然这看起来比使用 cut
或 awk
去除字段要多一些编程,但主要好处是您不需要生成新的子-process(就像你对 cut
和 awk
解决方案所做的那样)所以你应该发现性能得到了提高(并且对于大量输入字符串处理,性能提高应该非常明显)。
显然(?)如果您处理的数据 a) 包含逗号,b) 跨越多行 and/or c) 包含 non-printing/control 个字符,这可能会变得有点复杂。 .
我正在将 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 的内容变量作为标准输入。
以下命令序列会将值 1
、2018-05-16
、abc
和 123
分配给 VAR1
到 VAR2
,分别为:
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
复制到另一个您可以拆分的变量中
虽然这看起来比使用 cut
或 awk
去除字段要多一些编程,但主要好处是您不需要生成新的子-process(就像你对 cut
和 awk
解决方案所做的那样)所以你应该发现性能得到了提高(并且对于大量输入字符串处理,性能提高应该非常明显)。
显然(?)如果您处理的数据 a) 包含逗号,b) 跨越多行 and/or c) 包含 non-printing/control 个字符,这可能会变得有点复杂。 .