string - 构建包含用单引号括起来的变量值的 bash 字符串

标签 string bash variables quote

本应是最微不足道的任务让我做噩梦。

我的最终目标是从 bash 脚本发出以下命令:
sqlite3 my_db.db '.read my_file.sql'

这里有两个问题:
1. 单引号是必须的,不能用双引号代替
2. my_file.sql 是一个仅在运行时已知的变量。

所以我需要的是一种让 bash 构建一个字符串的方法,该字符串一方面包含一个变量值,而另一方面该值应该用单引号引起来。

我也更喜欢不依赖 AWK、Perl 等其他工具的解决方案。如果真的有必要,也许 sed 。

谢谢。


谢谢乔纳森和尼尔森。

我尝试了所有三个建议,但都失败了。
为简单起见,我将问题简化为以下内容:

  1. 我编写了以下脚本 (tst.sh):
    #!/bin/bash
    file=/tmp/1
    ls "'"$file"'"
    ls\'$file\'
    ls "'$file'"

  2. 然后我执行以下命令:
    $ touch/tmp/1
    $ ls '/tmp/1'
    /tmp/1
    $./tst.sh
    '/tmp/1': 没有那个文件或目录
    '/tmp/1': 没有那个文件或目录
    '/tmp/1': 没有那个文件或目录

似乎确实添加了引号,但生成的命令与手动输入时不一样。

有什么想法吗?

最佳答案

单引号不是必须的。以下所有命令都使用完全相同的参数运行 sqlite3:

sqlite3 my_db.db '.read my_file.sql'
sqlite3 my_db.db ".read my_file.sql"
sqlite3 my_db.db .read\ my_file.sql
sqlfile="my_file.sql"
sqlite3 my_db.db ".read $sqlfile"

在所有情况下,引号 (/escape) 在参数传递给 sqlite3 之前被解析并删除。这就是你想要的。您希望 sqlite3 获得两个参数:my_db.db.read my_file.sql。您希望 sqlite3 看到命令周围的引号——这相当于:

$ sqlite3 my_db.db
SQLite version 3.7.7 2011-06-25 16:35:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> '.read my_file.sql'
   ...>

...如您所见,这只会混淆 sqlite3。

顺便说一句,这与您的 ls 示例中的问题相同:您将单引号作为参数的一部分传递给 ls,因此它正在查找名称中包含单引号的文件,但没有找到它。您希望 shell 删除引号而不是将它们作为参数的一部分传递给命令。

关于string - 构建包含用单引号括起来的变量值的 bash 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607308/

相关文章:

c++ - 为什么我不能使用 if 和 if else 语句为变量赋值?

android - 如何在 android 中将 R.drawable 字符串转换为 R.drawable 整数格式?

c# - 仅替换字符串中出现的单个 "\n"

linux - 将数千个文件从一个目录复制到另一个目录时出现 "Argument too long"错误

python - 如何通过 sys.argv 按名称将变量值传递给 python 中的 main?

python - 类/函数全局变量没有在 Python 中返回?

c++ - gcc和turbo C的输出差异

javascript - node.js:嵌套for循环,字符串操作性能惨淡

bash - 删除文件 A 中包含文件 B 中字符串的所有行

bash - set -e 和后台进程