【发布时间】:2015-10-30 05:02:47
【问题描述】:
如何在执行前回显实际命令 WITH 扩展变量(由它们的值替换)? SO中有类似的问题,其中大多数答案建议使用set -x或set -v。不知何故,这在我的情况下不起作用。希望您能帮助查明错误:
myTest.sh的内容
#!/bin/sh
set -v # enable echo command before execution
myTable="TEST_COL890_TABLE"
WhereClause="coL2 > 0"
grep -Eio Col[0-9]+ <<- EOF
SELECT * FROM $myTable
GROUP BY Col1
WHERE $WhereClause
ORDER BY Col3
EOF
set +v # disable echo command before execution
执行者:
$ chmod 744 ./myTest.sh
$ sh ./myTest.sh
控制台输出(注意变量未展开)
myTable=TEST_COL890_TABLE
+ myTable=TEST_COL890_TABLE
WhereClause="coL2 > 0"
+ WhereClause='coL2 > 0'
grep -Eio Col[0-9]+ 选择 * 从 $myTable
按 Col1 分组
WHERE $WhereClause
由 Col3 订购
EOF
+ grep -Eio 'Col[0-9]+'
COL890
Col1
coL2
Col3set +vx # 在执行前禁用 echo 命令
+ 设置 +vx
预期的屏幕输出(变量 $myTable 和 $WhereClause 被它们的值替换)
myTable=TEST_COL890_TABLE
WhereClause="coL2 > 0"grep -Eio Col[0-9]+ SELECT * FROM TEST_COL890_TABLE
按 Col1 分组
哪里 coL2 > 0
由 Col3 订购
EOF
+ grep -Eio 'Col[0-9]+'
COL890
Col1
coL2
Col3
【问题讨论】:
-
它不起作用,因为它不是实际命令的一部分,它是重定向的一部分,命令只是
grep -Eio Col[0-9]+。尝试将值分配给变量,然后再将其输入grep,它可能会以这种方式显示扩展。 -
@Polymerase:请注意,你的 shebang 行是
#!/bin/sh,但如果你真的在谈论 Bash,它应该是#!/bin/bash(或#!/usr/bin/env bash) -
@mklement0 我的开发环境是 bash。但是该脚本将在带有 Korn shell 的 Redhat 6.4 上运行。如果我听从你的建议,那还可以吗?
-
@Polymerase:只要在您的目标机器上安装了 Bash,您就应该使用 Bash shebang 行——它可以让您自信地使用 Bash 功能而不必担心交叉-外壳兼容性。
-
我同意 mklement0,针对编写代码的特定 shell 更好。