我有一个奇怪的情况。我试图从文件中删除一些信息,当我直接将命令运行到终端时一切正常,但是一旦我在脚本中将它变成一个变量,它就会返回它应该剪切的内容和一个列表当前目录中的文件。
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
答案 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'
可避免出现一系列相关问题。我永远不记得你在变量赋值中是否真的需要$(...)
左右的双引号,所以我把它们放在一起是为了安全。