【发布时间】:2017-11-25 21:50:50
【问题描述】:
试试这个方法:
#!/bin/bash
myvals=`psql -d mydb -c "select id from table1 where 't'"`
ssh user1@host1.domain.tld "for i in $myvals; do echo \$i >> values; done"
只要 psql 只返回一个值,它就可以正常工作。但如果它有几个值,我会收到以下回复:
bash: -c: line 1: syntax error near unexpected token `2'
bash: -c: line 1: `2'
另外,我尝试过:
myvals='1 2 3'
然后它就可以正常工作了:值 1 2 3 被附加到远程主机上的“值”文件中;没有错误信息。
如果我尝试另一个子 shell 命令,例如 myvals=ls /bin,错误会再次出现。
很明显 $myvals 已经在本地主机上进行了评估,但是是什么让 subshell 结果如此不同?
【问题讨论】:
-
是什么让 subshell 结果如此不同? 答:变量中有换行符会搞砸解析器。试试
myvals=$'1\n2\n3'。 -
myvals在此脚本中根本不是数组。运行declare -p myvals转储它的类型和值——如果输出declare -- myvals=...它是一个字符串;如果它发出declare -a myvars=...它是一个数组。