我将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不会是这种情况,它会有不同的名称。
提前致谢。
答案 0 :(得分:0)
您可以在shell脚本中使用cut
命令来获取CSV文件的单个字段或整列,每次调用cut
命令一个。 cut
期望输入CSV数据通过标准输入提供,因此您可以使用“here”文档shell功能将SQLOUTPUT_STRING
shell变量的内容显示为stdin。
以下命令序列将分别将值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执行反引号中包含的命令并使用其输出作为文字替换值在export
语句中就地扩展,因为您特意请求了便携式shell码。现代ksh shell语法中可能存在替代语法和重定向运算符。
答案 1 :(得分:0)
让我们再试一次...假设您的数据中没有嵌入逗号,您可以使用read
命令的变体将字符串拆分为变量列表。
要显示此解决方案处理嵌入式空白区域,我们将从您的示例字符串的修改版本开始:
$ input="1,2018-05-16,abc def,asdf 123"
我们现在告诉read
使用逗号作为输入字段分隔符(IFS),我们将使用here-string将${input}
传递给{{1这给了我们:
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
的内容。
以上解决方案的bash fiddle和ksh93 fiddle显示相同的解决方案。
我之前的回答/ ramblings ......
如果您可以使用数组,请在&#34; bash split string into array&#34;上运行搜索。你应该得到几个SO点击来帮助你。
如果你绝对需要使用个别变量,我可能会使用参数替换去除字段。
${input}
将此应用于您的示例字符串,我们得到:
${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
删除字段更多的编程,但关键的好处是您不需要生成新的子字段-process(就像你对awk
和cut
解决方案所做的那样)所以你应该发现性能得到了提高(对于大量的输入字符串处理,性能改进应该非常明显。)
显然(?)如果您处理数据a)包含逗号,b)跨越多行和/或c)包含非打印/控制字符,这可能会变得更复杂...... < / p>