2013-07-30 52 views
1

我有一个奇怪的情况。我试图从文件中剪切一些信息,当我直接将命令直接运行到终端中时,一切正常,但只要我在脚本中将其变为一个变量,它就会返回它应该剪切的内容以及文件在当前目录中。切不起作为变量

cat query.sql | cut -d':' -f3,4 

作品,但...

QUERY_SQL="query.sql" 
MYSQL_COMMAND=`cat $QUERY_SQL | cut -d':' -f3,4` 
echo $MYSQL_COMMAND 

返回上述奇怪的输出。 我在做什么错?

编辑: 查询文件看起来是这样的......

[email protected]:3:SQL CODE 
+0

'echo $ QUERY_SQL'做它应该做什么? – che

+0

是的它确实..只是变化的是他们现在的变量 – arynhard

+0

@anubhava同样的输出 – arynhard

回答

3

我怀疑在MYSQL_COMMAND内容的东西被解释为一个文件名glob模式。尝试改变

MYSQL_COMMAND=`cat $QUERY_SQL | cut -d':' -f3,4` 
echo $MYSQL_COMMAND 

MYSQL_COMMAND="$(cut -d: -f3,4 < "$QUERY_SQL")" 
printf '%s\n' "$MYSQL_COMMAND" 

壳最佳防守编码的做法是把双引号变量替换,除非你知道一个事实,,你需要分词和水珠扩张发生在特定的替代之后。将echo更改为printf '%s\n'可避免相关的一组问题。我永远不会记得你是否真的需要在变量赋值中围绕$(...)加双引号,所以我把它们放在了安全的地方。

+0

这很有效......感谢您的建议,您只是帮助我在shell脚本中更好一点! – arynhard

+1

顺便说一下,它在'$(cut -d:-f3,4 <“$ QUERY_SQL”)周围没有双引号, – arynhard