ec命令+ exec之前的变量扩展

时间:2015-10-29 19:57:57

标签: linux bash

如何在执行之前回显实际命令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

2 个答案:

答案 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实用程序。