如何在双引号内的命令中嵌入变量?

时间:2017-05-14 03:23:07

标签: bash shell sqlite

我在shell中运行以下命令

sqlite3 db.db 'select * from myTable where myColumn = "foo"'

而不是foo我想替换变量COLUMN_NAME 我想将上述整个命令的输出存储到变量中。 我无法正确转义双引号。

以下不起作用

COLUMN_NAME="foo"
OUTPUT="$(sqlite3 db.db 'select * from myTable where myColumn = ""$(COLUMN_NAME)""')"

我收到以下错误Error: unrecognized token: "$"

非常感谢任何帮助:)

3 个答案:

答案 0 :(得分:4)

column_name="foo"
output="$(sqlite3 db.db 'select * from myTable where myColumn = "'"${column_name}"'" ')"

让我们分解"'"${column_name}"'"

  • 第一个",因为它在单引号字符串中,是文字的 - 是SQL的一部分。
  • 第二个字符'是句法的 - 关闭以'select之前的引号开头的单引号上下文,因此我们可以输入一个双引号上下文,其中变量扩展被尊重
  • 第三个字符"是句法字符 - 输入双引号上下文,其中变量扩展被接受。
  • ${column_name}是一个变量扩展。 (您也可以在没有花括号的情况下使用$column_name)。与$(column_name)对比,column_name作为命令运行"'"并替换该命令的输出。 请注意,这些扩展都不会在单引号中得到尊重,这就是我们在上面输入双引号上下文的原因。 (相比之下,如果替换的值包含空格,未加引号的上下文可以拆分为SQLite的多个参数。)
  • 最终"反向执行第三,第二和第一个项目符号点项:结束语法引号,重新输入单引号上下文,然后注入一个"
  • ...并且在此之后我们有一个单引号,结束单引号上下文,我们在之前添加了文字{{1}}。

答案 1 :(得分:1)

在SQL中,字符串文字should use single quotes。 这使它更容易:

output="$(sqlite3 db.db "select * from myTable where myColumn = '$column_value'")"

答案 2 :(得分:0)

你必须逃避单引号,因为它会阻止变量替换

检查此示例并应用于您的命令

foo=substituted; var="$(echo 'this is '"$foo"' here ')"; echo $var

this is substituted here