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@somehwhere.com:3:SQL CODE
4

1 回答 1

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 的最佳防御性编码实践是在每个变量替换周围加上双引号,除非您知道在特定替换后需要进行分词和全局扩展。更改echoprintf '%s\n'避免了一系列相关的问题。我永远不记得在变量赋值中是否真的需要双引号$(...),所以为了安全起见,我把它们放了进去。

于 2013-07-30T15:40:54.507 回答