削减不作为变量

时间:2013-07-30 15:24:11

标签: linux bash

我有一个奇怪的情况。我试图从文件中删除一些信息,当我直接将命令运行到终端时一切正常,但是一旦我在脚本中将它变成一个变量,它就会返回它应该剪切的内容和一个列表当前目录中的文件。

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

有效,但......

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

返回上面提到的奇怪输出。 我做错了什么?

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

email@somehwhere.com:3:SQL CODE

1 个答案:

答案 0 :(得分: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"

shell的最佳防御性编码实践是在每个变量替换周围放置双引号,除非你知道一个事实你需要进行单词拆分和全局扩展特别的替代品。将echo更改为printf '%s\n'可避免出现一系列相关问题。我永远不记得你在变量赋值中是否真的需要$(...)左右的双引号,所以我把它们放在一起是为了安全。