如何在执行之前回显实际命令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&gt; 0”
+ WhereClause ='coL2&gt; 0'
grep -Eio Col [0-9] +&lt;&lt; - EOF
SELECT * FROM $ myTable
Colours by Col1
在哪里$ WhereClause
按Col3订购 EOF
+ grep -Eio'Col [0-9] +'
COL890
COL1
COL2
Col3在执行前设置+ vx#disable echo命令 + set + vx
预期的屏幕输出(变量$ myTable和$ WhereClause由其值替换)
myTable的= TEST_COL890_TABLE
WhereClause =“coL2&gt; 0”grep -Eio Col [0-9] +&lt;&lt; - EOF
SELECT * FROM TEST_COL890_TABLE
Colours by Col1
coL2&gt; 0
按Col3订购 EOF
+ grep -Eio'Col [0-9] +'
COL890
COL1
COL2
Col3
答案 0 :(得分:3)
关于set -v
的Bash文档:
在读取时打印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"
答案 1 :(得分:2)
补充 KurzedMetal's helpful answer:
如果你仍然想要这里文档的灵活性(不必引用嵌入式双引号,剥离前导标签的选项),请尝试以下方法:
input_file
另请参阅:POSIX spec for :
,null实用程序。