【问题标题】:Cut not working as a variable剪切不能作为变量工作
【发布时间】:2013-07-30 15:24:10
【问题描述】:

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

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

【问题讨论】:

  • echo $QUERY_SQL 会做它应该做的事吗?
  • 是的。唯一的改变是它们现在是变量
  • @anubhava 相同的输出
  • 我在尝试时得到的唯一变化是,直接运行命令会输出多行结果,而echoing 结果会在同一行打印所有内容。
  • @Xaqq 你在使用上面的sql文件格式吗,你的工作目录里还有其他文件吗?

标签: linux bash


【解决方案1】:

我怀疑 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' 可以避免一系列相关问题。我不记得在变量赋值中是否真的需要在 $(...) 周围加上双引号,所以为了安全起见,我把它们放在里面。

【讨论】:

  • 那行得通...谢谢您的建议,您只是帮助我在 shell 脚本方面做得更好!
  • 顺便说一句,$(cut -d: -f3,4 &lt; "$QUERY_SQL") 周围没有双引号
猜你喜欢
  • 2014-06-10
  • 2022-10-19
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 2012-05-26
  • 2014-01-04
相关资源
最近更新 更多