我在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: "$"
非常感谢任何帮助:)
答案 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)
在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