Echo命令+ exec之前的variables扩展

如何在执行之前回显实际的命令WITHvariables扩展(由它们的值replace)? SO中也有类似的问题,其中大多数答案build议使用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 

控制台输出(通知variables不扩展)

myTable的= TEST_COL890_TABLE
+ myTable = TEST_COL890_TABLE
WhereClause =“coL2> 0”
+ WhereClause ='coL2> 0'

grep -Eio Col [0-9] + << – EOF
SELECT * FROM $ myTable
GROUP BY Col1
WHERE $ WhereClause
ORDER BY Col3
EOF
+ grep -Eio'Col [0-9] +'
COL890
COL1
COL2
COL3

在执行前设置+ vx#禁用回显命令
+设置+ vx

预期的屏幕输出(variables$ myTable和$ WhereClause被它们的值替代)

myTable的= TEST_COL890_TABLE
WhereClause =“coL2> 0”

grep -Eio Col [0-9] + << – EOF
SELECT * FROM TEST_COL890_TABLE
GROUP BY Col1
WHERE coL2> 0
ORDER BY Col3
EOF
+ grep -Eio'Col [0-9] +'
COL890
COL1
COL2
COL3

为了补充 KurzedMetal的有用答案 :

如果你仍然希望在这里文档的灵活性 (不必引用嵌入式双引号,剥离领先的标签的选项),请尝试以下操作:

 # Read input into variable $input via here-document IFS= read -r -d '' input <<-EOF SELECT * FROM $myTable GROUP BY Col1 WHERE $WhereClause ORDER BY Col3 EOF # Turn on tracing set -x # Use `:`, a special builtin called the null utility whose sole purpose is # to expand its arguments - and nothing else. # With -x on, this will print the expanded value. # If -x is off, expansions still occur, but without any visible or side effects. : "$input" # Invoke the command - input provided via stdin (<<<) will NOT show. grep -Eio 'Col[0-9]+' <<< "$input" # Turn tracing back off set +x 

另请参见: POSIX规范: null实用程序。

关于set -v bash文档:

在读取shell时输入shell行。

(之前的意思是不做扩展)。

set -x bash文档:

打印一条简单的命令,用于命令,事件命令,选择命令,以及在命令及其参数或关联的单词列表被扩展并且在它们被执行之前的算术。 PS4变量的值被扩展,结果值被打印在命令及其扩展参数之前。

我猜set -x不显示重定向的数据,你只看到set -v输出的未扩展的读取行。

如果将在EOF heredoc中使用的文本分配给一个变量,并且set -x将在分配时正确显示扩展值。

所以,改变你的代码:

 select="SELECT * FROM $myTable GROUP BY Col1 WHERE $WhereClause ORDER BY Col3" grep -Eio 'Col[0-9]+' <<< "$select"